Hej,
Im dłużej przeglądam to forum tym więcej pomysłów przychodzi do głowy. Ostatnim z nich jest wykres historii zapisanej temperatury. Ogarnąłem tutoriale w sieci, ustawiłem poszczególne elementy.
- Zainstalowałem RRD4j Persistence z poziomu PaperUI.
- W pliku addonces.cfg zmieniłem: persistence = rrd4j
- W ustawieniach PaperUI przypisałem rrd4j dla ustawienia Persistence
- Wprowadziłem zmiany w kolejnych plikach wg wzorów poniżej:
rrd4j.cfg
dht_temperature.def=GAUGE,120,-50,100,60
dht_temperature.archives=AVERAGE,0.5,1,10080:AVERAGE,0.5,60,89280
dht_temperature.items=dht_temperature
rrd4j.persists
// persistence strategies have a name and a definition and are referred to in the "Items" section
Strategies {
// for rrd charts, we need a cron strategy
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
default = everyMinute
}
Items {
// which data to be stored
dht_temperature : strategy = everyMinute
}
W katalogu openHAB\userdata\persistence\rrd4j powstał plik dht_temperature.rrd. Jak rozumiem to właśnie tutaj zapisywane są odczyty temperatury. Data pliku to 4.03.2018 godzina 19:10.
Mój czujnik temperatury ma taki item:
Number dht_temperature "Temperatura [%.1f °C]" {mqtt="<[broker:/biuro/lampa/temperature:state:default]"}
Najwyraźniej o czymś zapomniałem ponieważ po wejściu na poniższy adres dostaję pustą siatkę wykresu (w załączniku).
http://192.168.1.4:8080/rrdchart.png ?items=dht_temperature&period=8h
Zmiany w wykresach wprowadziłem w sobotę. Na ile zrozumiałem poradniki to odczytuję co minutę wartości temperatury. Zakładam, że jakieś dane powinny się zebrać do teraz.
Będę wdzięczny za wskazanie braków 😉
rrd4j.persist:
Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
default = everyChange, everyMinute.
}
Items {
HomeTemp* : strategy = everyChange, everyMinute, everyDay, restoreOnStartup
}
// vim: syntax=Xtend syntax=openhab
Możesz stworzyć sobie np item z grupą do której będziesz dodawał różne czujniki które będą na jednym wykresie:
Group HomeTemp "Wykres Temperatury" <chart>
Wtedy Twój item będzie wyglądać np
Number dht_temperature "Temperatura [%.1f °C]" (HomeTemp) {mqtt="<[broker:/biuro/lampa/temperature:state:default]"}
Oczywiście jak chcesz dodać tylko jeden item do wykresu to w pliku rrd4j.persist,'
wpisujesz tylko nazwę item bez "*"
Najważniejsze to zakomentuj :
#dht_temperature.def=GAUGE,120,-50,100,60
#dht_temperature.archives=AVERAGE,0.5,1,10080:AVERAGE,0.5,60,89280
#dht_temperature.items=dht_temperature
I restart Openhab tak dla spokoju....
Wprowadziłem podane powyżej zmiany. Wybrałem wersję uproszczoną dla jednego czujnika. Chcę to najpierw odpalić a potem będę dodawać kolejne. Po zmianach nadal nie widzę efektu. Zastanawia mnie kwestia braku zmian w dacie modyfikacji pliku: dht_temperature.rrd
Jak rozumiem odczyty nie są zapisywane do bazy danych...
rozumie że odczytujesz wykres bezpośrednio czy też z sitemap ?
w każdym razie przy jednym czujniku trzeba będzie poczekać na jakiś efekt...
pytanie co jaki czas robisz odczyt z czujnika....
możesz jeszcze zatrzymac serwis openhab...wywalić bazę dht_temperature.rrd
i wystartować openhab na nowo... baza zostanie utworzona od nowa. i wtedy za 30 minut zobacz..( przy założeniu że np odczyt z czujnika następuje co np..5 minut)
niestety jak się sam przekonałem zmiana w pliku rrd4j.persist powoduje całkowite przekonfigurowanie zapisu do baz...- jedyny sposó jaki znalazłem na powrót do poprzednich ustawień to ten opisany powyżej...
(aczkolwiek teraz przeszedłem na influxdb i wykresy w grafanie..)
Odpalam wykres z linka:
192.168.1.4:8080/rrdchart.png?items=dht_temperature&period=h
Usunąłem plik dht_temperature.rrd, zrobiłem restart OpenHaba. Po chwili założył się nowy plik.
Po zmianach o których mowa powyżej sytuacja wygląda tak:
rrd4j.persist
Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
default = everyChange, everyMinute.
}
Items {
HomeTemp : strategy = everyChange, everyMinute, everyDay, restoreOnStartup
}
// vim: syntax=Xtend syntax=openhab
rrd4j.cfg
#dht_temperature.def=GAUGE,120,0,30,60
#dht_temperature.archives=AVERAGE,0.5,1,10080:AVERAGE,0.5,60,89280
#dht_temperature.items=dht_temperature
Co do częstotliwości odczytu to wg. mnie jest to zdefiniowane w rrd4j.cfg. Mówi o tym pierwszy wiersz i ostatnia wartość. U mnie to 60 sekund. Tyle, że zgodnie z poleceniem zakomentowałem to... Nie bardzo rozumiem natomiast zapisy w drugim wierszu - AVERAGE.
HomeTemp ?? Czy item z którego czytasz nie nazywa się przypadkiem : dht_temperature
Items {
dht_temperature : strategy = everyChange, everyMinute, everyDay, restoreOnStartup
}
Ok, poprawiłem. Nic to nie zmieniło. Zastanawia mnie dlaczego plik dht_temperature.rrd nie jest aktualizowany. Moim zdaniem co zapis nowych odczytów powinna się zmieniać data modyfikacji.
Mówi o tym pierwszy wiersz i ostatnia wartość. U mnie to 60 sekund. Tyle, że zgodnie z poleceniem zakomentowałem to... Nie bardzo rozumiem natomiast zapisy w drugim wierszu - AVERAGE.
Te wszystkie funkcje miałeś zakomentować ponieważ są Ci nie potrzebne .
W regułach rrd4j masz już co ma robić.
Powyższe funkcje służą uśrednianiu wyników i ich grupowaniu.
Plik bazy miałeś skasować po to aby po zakomentowaniu tamtych ustawień baza tworzyła się w oparciu o reguły zawarte w rrd4j.persist.
Aby to zadziałało najlepiej zatrzymać OH , skasować bazę i odpalić OH.
U mnie to 60 sekund
Chodziło mi tu o to co jaki czas czujnik wysyła dane do brokera mqtt.. też co 60 sek ?
Możesz zrobić tak:
Zatrzymać OH, zmienić nazwę plików rrd4j.persist na rrd4j.persist_old i rrd4j.cfg na rrd4j.cfg_old.
Skasować plik dht_temperature.rrd
Wystartować OH.
(Chodzi o to że miałem podobnie po kombinacjach z rd4j.cfg i tworzenie średnich ważonych 🙂 ale po stwierdzeniu że jednak jest to za mało skalowane chciałem wrócić do domyślnych ustawień i był problem...)
Jak OH wystartuje to znów robisz stop i i zmieniasz nazwy plików na oryginalne...
I znów start OH. Powinien zapisywać już normalnie...
Pamiętaj że to masz mieć zakomentowane !
#dht_temperature.def=GAUGE,120,0,30,60
#dht_temperature.archives=AVERAGE,0.5,1,10080:AVERAGE,0.5,60,89280
#dht_temperature.items=dht_temperature
W innym przypadku nadal rrd4j będzie używał Twoich ustawień 🙂
Ustawienia czujnika w AFE to 60 sekund.
Ok, teraz rozumiem i chyba znalazłem błąd. U mnie plik nazywał się rrd4j.persists a nie rrd4j.persist (chodzi o s na końcu) Zmieniłem nazwę, wyłączyłem OH skasowałem bazę, odpaliłem od nowa. Czekam od kilku minut i nie założył się plik dht_temperature.rrd. W logu mam:
2018-03-05 12:48:04.706 [ERROR] [4j.internal.charts.RRD4jChartServlet] - Error generating graph: {}
java.io.FileNotFoundException: Could not open /volume1/@appstore/openHAB/userdata/persistence/rrd4j/dht_temperature.rrd [non existent]
Skasowałeś bazę ale chyba nie wyłączyłeś OH.. To teraz daj restart OHi powinno gadać
Zgłupiałem kompletnie. Teraz działa - plik rrd się aktualizuje do chwilę. Generuje się wykres. Zmieniłem dwie rzeczy:
1) rrd4j.persist
Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
default = everyChange, everyMinute
}
Items {
dht_temperature : strategy = everyChange, everyMinute, everyDay, restoreOnStartup
}
// vim: syntax=Xtend syntax=openhab
W wierszu default = everyChange, everyMinute na końcu była kropka. Wywaliłem ją.
2) Zrobiłem kopię pliku rrd4j.persist i zmieniłem nazwę na rrd4j.persists
I teraz nie wiem co pomogło ale ważne, że działa.
7keys dzięki za cierpliwość i pomoc.
A to jeszcze jedna rzecz. Sam wykres ładnie działa pod linkiem:
http://192.168.1.4:8080/rrdchart.png ?items=dht_temperature&period=D
W związku z tym do sitemap dodałem:
Chart item=dht_temperature service="dht_temperature" period=D
I nie pojawia się obrazek... Zamiast niego jest ikona wyświetlana jak nie ma obrazka...
Ok już wiem co było źle:
Chart item=dht_temperature period=D
@eathan, zastanawiam się co chcesz osiągnąć tą strategią zbieranie danych z czujnika
strategy = everyChange, everyMinute, everyDay, restoreOnStartup
teraz zapisujesz
- każdą zmianę wartości z czujnika,
- dodatkowo zapisujesz co 1 minute wartość, którą masz dla dht_temperature item w openHab, niezależnie od pkt powyżej
- dodatkowo zapisujesz wartość per day dla dht_temperature, czyli jedną wartość na 24h - to zupełnie do wykresów nic nie wnosi.
Ja osobiście zbieram tylko zmiany temperatury. W czujnikach mam wysyłanie temperatury co 1min, ale do bazy wysyłam tylko dane tylko kiedy temperatur się zmieniła - nie wysyłam do bazy info, że temperatura jest taka sam jak minute temu.
To oszczędza trochę miejsca na dysku - przy tradycyjnych dyskach to pewnie żaden problem ze względu na ich duży rozmiar. Ale większy problem to zwiększająca się ilość danych, które silnik do wykresów musi przetworzyć, żeby wyświetlić wykres. Tak na oko przy Twoich ustawieniach będziesz generował lekko 2000 wpisów na dobę. Miesięcznie 60tys.
Moja sugestia;
- jeśli chcesz zapisywać co minute zostaw tylko; everyMinute, będziesz miał równe interwały danych
- jeśli chcesz tylko zmieniająca się temperaturę, zostaw tylko: everyChange
- jeśli chcesz zapisywać wartości z taką sama częstotliwością, jaką przychodzą z czujnika to OH2 to zrób: everyUpdate
no i restoreOnStartup na końcu ma sens.
pozdrawiam
adrian masz rację. Skopiowałem z propozycji kolegi powyżej. U mnie nie ma aż takiej potrzeby. Zależy mi wyłącznie na tym by mieć wgląd w to jak wygląda rozkład temperatury w pomieszczeniu. Zapis zmiany zupełnie wystarczy.
Witam gdzie zapisują się pliki temperature.rrd
Chodzi mi o pliki .rrd czyli pliki temperatury.
U mnie niema w openhab2 Persistence. W openhabian tworzył się plik ale nie dodawało danych wiec zainstalowałem rasbian + openhab2.