Im Bashscript rechnen?

brenner

Commander
Registriert
Apr. 2002
Beiträge
3.037
Moin moin.

Ich werte einen Stromzähler aus und erhalte in den Logfile diese Ausgaben:

2013-04-07_11:56:01 CUL_EM_2 CNT: 97 CUM: 51.844 5MIN: 1.625 TOP: 4.360
2013-04-07_12:01:02 CUL_EM_2 CNT: 98 CUM: 51.938 5MIN: 1.125 TOP: 2.820
2013-04-07_12:06:02 CUL_EM_2 CNT: 99 CUM: 52.021 5MIN: 1.000 TOP: 2.404
2013-04-07_12:11:03 CUL_EM_2 CNT: 100 CUM: 52.094 5MIN: 0.875 TOP: 2.246
2013-04-07_12:16:04 CUL_EM_2 CNT: 101 CUM: 52.188 5MIN: 1.125 TOP: 2.273
2013-04-07_12:21:04 CUL_EM_2 CNT: 102 CUM: 52.292 5MIN: 1.250 TOP: 2.315
2013-04-07_12:26:05 CUL_EM_2 CNT: 103 CUM: 52.385 5MIN: 1.125 TOP: 2.451
2013-04-07_12:36:06 CUL_EM_2 CNT: 105 CUM: 52.510 5MIN: 0.625 TOP: 0.679
2013-04-07_12:41:07 CUL_EM_2 CNT: 106 CUM: 52.625 5MIN: 1.375 TOP: 2.679
2013-04-07_12:46:07 CUL_EM_2 CNT: 107 CUM: 52.844 5MIN: 2.625 TOP: 2.679
2013-04-07_12:51:08 CUL_EM_2 CNT: 108 CUM: 53.052 5MIN: 2.500 TOP: 2.568
2013-04-07_12:56:09 CUL_EM_2 CNT: 109 CUM: 53.188 5MIN: 1.625 TOP: 2.467
2013-04-07_13:01:09 CUL_EM_2 CNT: 110 CUM: 53.240 5MIN: 0.625 TOP: 0.708


Soweit so gut. Ich grep´pe und sed´e mir dann alles zurecht so das ich nur noch die relevanten Daten übrig habe
2013-04-07_12:41:07 CUM: 52.625
2013-04-07_12:46:07 CUM: 52.825

Der Zeitstempel ist ja selbsterklärend. CUM ist der aktuelle Zählerwert, also hier um 12:41Uhr 52625Wh und fünf Minuten später dann 52825Wh. Das heißt das in den 5 Minuten 200Wh verbraucht wurden.




Nun würde ich mir aber gerne den Verbrauch von z.B. einer Stunde oder einer Woche berechnen! Da immer wieder Datenpakete verloren gehen, kann ich nicht z.B. die letzten zwölf "5MIN" Werte addieren. Ich kann quasi nur die Differenz zwei "CUM" Werte nehmen in Abhängikeit vom Zeitstempel.

Da hört es dann leider auf bei mir.

Beispiel Verbrauch der letzten vollen Stunde. Ich müsste ja dann irgendwie, wenn aus z.B. 12Uhr 13Uhr geworden ist, einmal den CUM Wert speichern. Wenn dann die Uhr von 13 auf 14Uhr gesprungen ist, den gespeicherten CUM Wert vom aktuellen CUM Wert subtrahieren um den Verbauch von einer Stunde zu erhalten.

Dazu kommt dann noch das das Abfragescript nur einmal alle 5 Minuten aufgerufen wird (von der Visualisierung), es also quasi kein dauerhaft laufenden Script mit endlos Schleife sein darf .

Alles nicht einfach :(
 
Ich würde mich an dem Problem mal versuchen, es wäre schön wenn du ein paar mehr Daten liefern könntest von dem Log. Man muss halt sehen wie man deinen Datenverlust vernünftig ausgleicht.

Edit: Wenn du das Log von einer ganzen Woche hättest wäre das super.
 
Ehrlich gesagt verstehe ich das Problem garnicht?
Nun würde ich mir aber gerne den Verbrauch von z.B. einer Stunde oder einer Woche berechnen!
Und wo liegt das Problem, du hast doch die Logfiles samt darin gespeicherter Werte?

Beispiel Verbrauch der letzten vollen Stunde. Ich müsste ja dann irgendwie, wenn aus z.B. 12Uhr 13Uhr geworden ist, einmal den CUM Wert speichern.
Du hast doch die Logfiles? Werden die überschrieben oder gelöscht?
 
Hab am Wochenende das Ganze Ding erst aufgesetzt und noch nicht so viel schöne Daten. Ich hoffe das log im Anhang reicht.


Meine Idee war jetzt (z.B. beim Stundenverbrauch) zu gucken wann der Stundenwechsel war und die Differenz davon zu nehmen (also vom CUM-Wert).

Wenn ein Paket beim Stundenwechsel fehlt, ist der Stundenverbauch dann ja eh nicht ganz korrekt, eben um den fehlenden Wert.
Wenn man 24H berechnet, dann fällt das schon gar nicht mehr auf ob jetzt die Differenz von 24h oder z.B. 24h 10Minuten dargestellt wird.

Anhang anzeigen CUL_EM_2.txt
 
so gehts
das musst du dann nur in cron eintragen
alle 5 minuten

das script rechnet die letzten 2 zeilen gegeneinander
starten mit

./scriptname /pfad/logname

Code:
#!/bin/bash

werte=$(tail -n2 $1 |grep -m2 ^2013 |awk '{print $1" "$6}')

zeit1=$(echo $werte |awk '{print $1}');
wert1=$(echo $werte |awk '{print $2}' |sed 's/\.//');
zeit2=$(echo $werte |awk '{print $3}');
wert2=$(echo $werte |awk '{print $4}' |sed 's/\.//');

echo -e "Verbrauch von $zeit1 bis $zeit2 = $(($wert2 - $wert1))"
die ausgabe kannst du dir in ein anderes log ausgeben lassen einfach mit >/wo/auch/immer/log

damit kannst du dann noch ein daily monthly script machen
das das mit uniq auswertet
 
Zuletzt bearbeitet:
Mein Script um die Daten für die Visualisierung aufzubereiten sieht übrigens momentan so aus.

Code:
#!/bin/bash

#Variablen
LOG_FILE_CNT="/opt/fhem/log/CUL_EM_2.log"

#Inhalt des letzten Datenpaketes fuer auslesen.
#Ausgabe: CNT:*.* CUM:*.* 5MIN:*.* TOP:*.*
a=`tail -n1 "$LOG_FILE_CNT" | cut -d ' ' -f3,4,5,6,8,9,11,12 | sed "s/: /:/g" | sed "s/ / /g"`

#Cacti konforme Ausgabe um alle Werte erfasen zu können
printf "$a $b"


Die Ausgabe sieht dann so aus:
CNT:142 CUM:65.979 5MIN:0.125 TOP:0.125

So kann die Visualisierung die Daten sauber einlesen und darstellen.
Idealerweise würde die Ausgabe dann zum Schluss so aussehen:
CNT:142 CUM:65.979 5MIN:0.125 TOP:0.125 1h:500 24h:25000 1w:500000 1m:84373674
Ergänzung ()

Gorgone schrieb:

Ohh, das ging ja zeitnah, hab grad selber noch einen Beitrag geschrieben. Bin mal gespannt.
Ergänzung ()

Gorgone schrieb:
so gehts
das musst du dann nur in cron eintragen
alle 5 minuten


Das cron macht ja die Visualisierung, die ruft alle 5 Minuten das Script auf und schnappt sich die Werte.

Mein Script sieht jetzt zum testen mal so aus

Code:
#!/bin/bash
#Variablen
LOG_FILE_CNT="/opt/fhem/log/CUL_EM_2.log"

#Inhalt des letzten Datenpaketes fuer Cacti auslesen.
#Ausgabe: CNT:*.* CUM:*.* 5MIN:*.* TOP:*.*
a=`tail -n1 "$LOG_FILE_CNT" | cut -d ' ' -f3,4,5,6,8,9,11,12 | sed "s/: /:/g" | sed "s/ / /g"`


#Cacti konforme Ausgabe um alle Werte erfasen zu können
printf "$a"

####
werte=$(tail -n2 $LOG_FILE_CNT |grep -m2 ^2013 |awk '{print $1" "$6}')
 
zeit1=$(echo $werte |awk '{print $1}');
wert1=$(echo $werte |awk '{print $2}' |sed 's/\.//');
zeit2=$(echo $werte |awk '{print $3}');
wert2=$(echo $werte |awk '{print $4}' |sed 's/\.//');
printf "\n"
printf "\n"
echo -e "Verbrauch von $zeit1 bis $zeit2 = $(($wert2 - $wert1))"

Das funktioniert auch, danke, aber wie schaffe ich jetzt das er nicht die letzten zwei Zeilen gegeneinander rechnet sondern die mit Stunden, Tages, Wochenabstand usw.?
 
Zuletzt bearbeitet:
also /opt/fhem/log/CUL_EM_2.log ist deine "echte" log datei richtig ?
diese enthält die werte die du da oben angegeben hast ?

also das eigentlich nicht schwierig du "benötigst" für jeden abrechnungszeitraum stunde tag woche monat
ein script
das stündliche erstellt eine neue stunde.log datei wo du willst
die tägliche wertet diese aus und erstellt eine tag.log datei
die wird wiederrum durch die woche.log und dann monat.log ergänzt

es gibt in etc die cron folder da brauchst du nur jeweils die scripte hineinkopieren
und du kannst auch die logdateien sichern
da du in der stunde.log nur maximal 24 werte hast kannst du eine

while read line
do
command
done <file

schreiben die wertet nur vorhandene aus
lies mal ein bischen das ist sehr interessant
wenn du fragen hast zur syntax kein problem aber ein wenig initiative ist immer gut :evillol:
 
Zurück
Oben