Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Użytkownik

Witam,
Zbieram dane z termometrów do pliku, a temperatura jest zapisywana jest z czasem Unix.
W jaki sposób wyczyścić dane z pliku starsze niż 30 dni?
Format danych:
[1406225590000,18.00],[1406225705000,18.00],[1406226005000,18.00],[1406226304000,18.00],[1406226605000,18.00], (...)
Z góry dziękuję za pomoc.
Offline
Użytkownik

Nikt nie ma pomysłu jak to zrobić?
Czy po prostu nie da się zrobić takich rzeczy?
Offline


Członek DUG



Przy każdym dodaniu [...] na końcu pliku usuń [...] z początku pliku? (tylko warunek startowy - musi być ileśtam [...] w pliku; możesz go zainicjować pustymi "sekcjami" na przykład...
Basha nie znam więc nie napiszę jak to w skrypcie ma wyglądać, ale idea chyba zadziała.

Offline



człowiek pasjonat :D
A ja mam propozycje innego algorytmu:
- sprawdz czas teraz
- sprawdz czas temperatury
- jesli czas teraz jest wiekszy od czasu temperatury o 30 dni, to usun a jesli nie to zostaw
Czyli bash, narzedzie do przetwarzania tekstu i przykladowo odejmowanie zmiennych.
Nie wiem tylko jak to komputerowi przekazac.
Ostatnio edytowany przez Pavlo950 (2014-09-21 08:39:55)
Offline



Też człowiek :-)




Algorytm widzę następująco:
1. Zamień aktualny czas na unixowy.
2. Jeżeli AKTUALNY_CZAS - CZAS_Z_POMIARU > 2592000 Usuń
Czyli wydobywasz komplety [czas,pomiar] i sprawdzasz czy różnica jest większa niż 2592000. Jeżeli jest większa oznacza to, że pomiar jest starszy niż 30 dni :)
Ostatnio edytowany przez Piotr3ks (2014-09-21 14:33:05)
Offline
Użytkownik

Kolega z elektroda.pl mi pomógł i wyszedł skrypt Bash, który czyści dane starsze niż 3 miesiące:
#!/bin/bash
timeNow=`date +%s`
echo "Czas teraz: ""$timeNow"
timeNow=$[timeNow-7889232]
timeNow=$[timeNow*1000]
echo "Czas teraz - miesiac: ""$timeNow"
plik=/var/www/0.txt
plikNowy=/var/www/0.nowy.txt
daneNowe=`awk -v x="$timeNow" ' \
BEGIN { RS="["; FS=","; CONVFMT = "%.16g"; ORS=""; OFS="" } \
{ \
if (($1 > x) && ($1>0)) print "["$1","$2"," ; \
} \
' "$plik" `
echo "$daneNowe" > "$plikNowy"
echo "$daneNowe"Offline




Pan inż. Cyc





Sporo zbednych operacji
date --date="30 days ago" +%s
I mamy czas 30 dni od aktualnego bez zbędnej matematyki, a w razie potrzeby mozna bardzo latwo zmienic ilosc dni.
A żeby pozbyć się mnożenia
zmienna="`date --date="30 days ago" +%s`000"
Offline
Użytkownik

Czy tak to ma wyglądać?
#!/bin/bash
timeNow="`date --date="90 days ago" +%s`000"
plik=/var/www/0.txt
plikNowy=/var/www/0.nowy.txt
daneNowe=`awk -v x="$timeNow" ' \
BEGIN { RS="["; FS=","; CONVFMT = "%.16g"; ORS=""; OFS="" } \
{ \
if (($1 > x) && ($1>0)) print "["$1","$2"," ; \
} \
' "$plik" `
echo "$daneNowe" > "$plikNowy"Offline




Pan inż. Cyc





Tak, choć drugą cześć też da się łatwiej zrobić, pomyśle o czymś w weekend. :)
Offline
Użytkownik

qluk napisał(-a):
Tak, choć drugą cześć też da się łatwiej zrobić, pomyśle o czymś w weekend. :)
Z góry dziękuje ;)
Offline




Pan inż. Cyc





pimowo napisał(-a):
Witam,
Zbieram dane z termometrów do pliku, a temperatura jest zapisywana jest z czasem Unix.
W jaki sposób wyczyścić dane z pliku starsze niż 30 dni?
Format danych:Kod:
[1406225590000,18.00],[1406225705000,18.00],[1406226005000,18.00],[1406226304000,18.00],[1406226605000,18.00], (...)Z góry dziękuję za pomoc.
Pytania:
1) skad są te dodatkowe zera na końcu sygnatury czasu?
2) rozumie że plik to jeden ciąg znaków bez znaków nowej linii?
3) czy temperatury poniżej 10 są zapisywane z zerem wiodącym?
4) ujemne posiadają znak?
Offline
Użytkownik

Może będzie lepiej jak pokarze pokażę kod, który zbiera dane termometrów
<?php
$path = "/var/www/"; // Sciezka gdzie bedzie zapisywalo dane, domyslnie /www/meteo/
system("digitemp_DS9097 -a > /var/www/meteo2.txt && mv /var/www/meteo2.txt /var/www/meteo.txt");
ini_set( 'date.timezone', 'Europe/Berlin' );
$a = array();
$e = explode("Sensor ",file_get_contents("/var/www/meteo.txt")); unset($e[0]);
foreach($e as $v) {
$e1 = explode(" ",$v);
$id = $e1[0]; // Id Termometra
$temp = $e1[2]; // Temperatura na termometrze
if(file_exists($path.$id.".txt"))
file_put_contents($path.$id.".txt",",[".time(NULL)."000,".$temp."]",FILE_APPEND);
else
file_put_contents($path.$id.".txt","[".time(NULL)."000,".$temp."]",FILE_APPEND);
$a[($id)] = $temp;
}
file_put_contents($path."last.txt",serialize($a)); // ostatnie dane
system('digitemp_DS9097 -t 0 -q -o "%.2C" > /home/serwer/temperatura/ulica.txt');
system('digitemp_DS9097 -t 5 -q -o "%.2C" > /home/serwer/temperatura/salon.txt');
?>Ostatnio edytowany przez azhag (2014-09-26 22:17:24)
Offline







Podobno człowiek...;)








Jak masz kod php, który zbiera z termometrów, to niech lepiej ten kod zacznie pakować wyniki do bazy SQL, każdy tydzień lub miesiąc w osobnej tabeli, i wtedy wybieranie czy kasowanie poszczególnych rezultatów będzie równie trudne, co zjedzenie bułki z masłem.
Do wyboru masz Mysql, Postgresql, Sqlite albo Firebirda, PHP obrabia te wszystkie bazy, da się też zapiąć PHP do Oracla albo MSSQL.
Ostatnio edytowany przez Jacekalex (2014-09-27 00:43:08)
Offline
Użytkownik

Gdybym ja potrafił napisać sobie takie skomplikowane programy/kody/skrypty to bym na pewno zrobił bazę np. Mysql i tam wrzucał wszystkie wyniki i nic nie kasował. Nie pogardziłbym danymi z 3, 6 czy tam 12 miesięcy :) Ale cóż wiedzy brak :(
Przy tym co mam pojawił się problem "zamulania" skryptu gdy danych jest więcej niż 3-4 miesiące i stad pomysł kasowania danych.
Termometrów w sumie mam 8-docelowo będzie 12szt.
Offline




Pan inż. Cyc





To jeszcze jedno pytanie.... Jaki jest powód że to jest w PHP?
Jacekalex: Do tak małych danych mySQL? Już prędzej record file.
Offline
Użytkownik

Nie wiem. Skrypty znalazłem w Internecie, a dokładnie na forum eko.one.pl
Są w sumie dwa skrypty:
-ten który dałem wcześniej,
-skrypt który "rysuje" wykresy (również PHP)
<?php
$id = $_GET['id']; $temp = array(); $all = false;
$temp[0] = array("name" => "Ulica", "all" => true);
$temp[1] = array("name" => "Podwórko", "all" => true);
$temp[2] = array("name" => "Łazienka", "all" => true);
$temp[3] = array("name" => "Sypialnia", "all" => true);
$temp[4] = array("name" => "Boys", "all" => true);
$temp[5] = array("name" => "Salon", "all" => true);
$temp[6] = array("name" => "Kuchnia", "all" => true);
$temp[7] = array("name" => "Korytarz", "all" => true);
foreach(unserialize(file_get_contents("last.txt")) as $i => $t) {
if(isset($temp[($i)]))
$temp[($i)]["temp"] = $t; // Obecna Temp
}
if(!isset($temp[($id)])) // Gdy brak id to pokazuj wszystkie czujniki z parametrem all = true
$all = true;
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>temperatura</title>
<link rel="shortcut icon" href="pimowo.ico" />
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function() {
Highcharts.setOptions({
lang: {
months: ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Śierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
weekdays: ['Nie', 'Pon', 'Wt', 'Śr', 'Czw', 'Pt', 'Sob'] },
global: {
useUTC: false
}
}),
window.chart = new Highcharts.StockChart({
chart: {
renderTo: 'container'
},
xAxis: {
type: 'datetime',
dateTimeLabelFormats: {
second: '%d-%m-%y<br/>%H:%M:%S',
minute: '%d-%m<br/>%H:%M',
hour: '%d-%m<br/>%H:%M',
day: '%Y<br/>%d-%m',
week: '%Y<br/>%d-%m',
month: '%m-%Y',
year: '%Y'
}
},
rangeSelector: {
buttons: [{
type: 'day',
count: 1,
text: '1d'
}, {
type: 'day',
count: 7,
text: '7d'
}, {
type: 'month',
count: 1,
text: '1m'
}, {
type: 'month',
count: 3,
text: '3m'
}],
selected: 0
},
title: {
text: '<?php echo ($all ? "Temperatura" : "Temperatura - ".$temp[($id)]['name']); ?>'
},
yAxis: {
title: {
text: 'Temperatura ( °C )'
},
},
<?php
if(!$all) {
echo "series: [{
name: 'Temperatura',
data: [".file_get_contents($id.'.txt')."],
type: 'spline',
shadow: true,
tooltip: {
valueDecimals: 2,
valueSuffix: '°C'
}
}] ";
} else {
echo "series: [";
$f = false;
foreach($temp as $k => $v) {
if(!$v['all']) continue;
if($f) echo ",";
echo "{
name: '".$v['name']."',
data: [".file_get_contents($k.'.txt')."],
type: 'spline',
shadow: true,
tooltip: {
valueDecimals: '2',
valueSuffix: ' °C'
}
}";
$f = true;
}
echo "] ";
}
?>
});
});
</script>
</head>
<body>
<script src="js/highstock.js"></script>
<script src="js/modules/exporting.js"></script>
<script type="text/javascript" src="js/themes/gray.js"></script>
<b> <a href="?"> Wykres wszystkich termometrów </a></b>
<table rules="all" border=1 width="100%"><tr width="100%">
<br />
<br />
<?php
$cd = "";
foreach($temp as $k => $v) {
echo '<td align="center"><a href="?id='.$k.'">'.$v["name"].'</a></td>';
$cd .= '<td align="center">'.$v["temp"].'</td>';
}
echo "</tr><tr>".$cd."</tr>"
?>
</table><br>
<div id="container" style="height: 370px"></div><br>
</div>
</center>
</body>
</html>A może zamiast kombinować i kasować dane to da się jakoś zrobić "normalną" bazę danych?
Ostatnio edytowany przez pimowo (2014-09-26 23:09:32)
Offline







Podobno człowiek...;)








qluk napisał(-a):
To jeszcze jedno pytanie.... Jaki jest powód że to jest w PHP?
Jacekalex: Do tak małych danych mySQL? Już prędzej record file.
SQlite nie jest ani wielki, ani ciężki, też da radę.
Poza tym co ile sekund taki pomiar jest zapisywany?
Bo jak np 10 razy na sekundę, to i Mysql może być za słaby. :D
Offline




złodziej wirków ]:->
Jacekalex napisał(-a):
Poza tym co ile sekund taki pomiar jest zapisywany?
Bo jak np 10 razy na sekundę, to i Mysql może być za słaby. :D
Masz przykładowe dane z timestampami to sobie policz co ile jest zapisywany ;p
Offline
Użytkownik

Pomiar jest co 5 minut.
Offline







Podobno człowiek...;)








winnetou napisał(-a):
Jacekalex napisał(-a):
Poza tym co ile sekund taki pomiar jest zapisywany?
Bo jak np 10 razy na sekundę, to i Mysql może być za słaby. :DMasz przykładowe dane z timestampami to sobie policz co ile jest zapisywany ;p
Nawet jakbym miał przykładowe, to na razie jest 8 termometrów,
a to nie oznacza, że z alledrogo nie idzie następne 200 termometrów.
Poza tym ja tam nie mam parcia na rejestrowanie temperatur w okolicy. :D
Offline
Użytkownik

Jacekalex napisał(-a):
winnetou napisał(-a):
Jacekalex napisał(-a):
Poza tym co ile sekund taki pomiar jest zapisywany?
Bo jak np 10 razy na sekundę, to i Mysql może być za słaby. :DMasz przykładowe dane z timestampami to sobie policz co ile jest zapisywany ;p
Nawet jakbym miał przykładowe, to na razie jest 8 termometrów,
a to nie oznacza, że z alledrogo nie idzie następne 200 termometrów.
Poza tym ja tam nie mam parcia na rejestrowanie temperatur w okolicy. :D
pimowo napisał(-a):
Termometrów w sumie mam 8-docelowo będzie 12szt.
Offline







Podobno człowiek...;)








To chyba najlepszy byłby SQlite, chociaż ja bym zatrudnił Mysqla.
Poradników w typie Php i Sql masz kilka tysi na necie, jakbyś te skrypty chciał przeżeźbić na SQL, to jest bardziej niż wykonalne.
Ten jest chyba najlepszy angielski:
http://www.w3schools.com/php/php_mysql_intro.asp
Po polsku też jest tego trochę.
Ostatnio edytowany przez Jacekalex (2014-09-27 02:35:20)
Offline
Użytkownik

Czyli z tego co mówisz to najlepiej by było zrobić bazę danych z prawdziwego zdarzenia, a nie zapisywać danych w formie txt.
W sumie to nie musiałbym kasować żadnych danych. Czyli jak dla mnie jeszcze większa funkcjonalność :)
Offline







Podobno człowiek...;)








Też musiałbyś kasować, bo dyzie to nie gumki od majtek, tylko w SQL to banalnie proste, np
DELETE FROM wyniki WHERE timestamp < UNIX_TIMESTAMP('wartość');Strasznie trudne, prawda?
Offline