Pro záznam a následné zobrazení grafů z IoT/web teploměrů, čidel a meteostanice používám RRD databázi. Z té se pak přímo na serveru generují grafy jednotlivých měřených veličin.
Když k zařízení přidáte čidlo, je potřeba RRD rozšířit o další DS. Pouhé přidání na konec databáze je otázka jednoho příkazu.
rrdtool tune filename.rrd DS:ds_name:GAUGE:900:-50:100
Pozn:900:-50:100 = period:MIN:MAX Více viz man rrdtool
Pokud však potřebujete přidat DS někam jinam než na konec databáze, je to trošku složitější.
Většinou se jedná o případ, kdy je prvotní návrh RRD databáze nešťastný a nepočítá s rozšířením o další měřené veličiny. Čas však tento požadavek přinese.
U mne to nastalo tím, že mám jednu z veličin navrženou tak, že jeden konkrétní DS "MUSÍ BÝT POSLEDNÍ"
Poznámka: je to stav čidla, který se do RRDwrite přidává mimo hlavní POST – jak říkám, špatný návrh
Naštěstí není to neřešitelné. Musí se na to ale oklikou – export do XML, jeho úprava a následná obnova. Takže jdeme na to.
Záloha a export souboru databází
cp filename.rrd filename.rrd_bak
rrdtool dump filename.rrd > filename.xml
Otevřít XML v nějkém textovém editoru, najít definici DS. Něco jako
nano filename.xml
<ds>
<name> t </name>
<type> GAUGE </type>
<minimal_heartbeat> 600 </minimal_heartbeat>
<min> 0.0000000000e+00 </min>
<max> 1.0000000000e+08 </max>
<!-- PDP Status -->
<last_ds> 1339488487 </last_ds>
<value> 2.0762858667e+05 </value>
<unknown_sec> 0 </unknown_sec>
</ds>
...
Pak přidat nový DS na pozici, kam potřebujete
<ds> ... </ds>
<ds>
<name> my_new_ds </name>
<type> GAUGE </type>
<minimal_heartbeat> 600 </minimal_heartbeat>
<min> 0.0000000000e+00 </min>
<max> 1.0000000000e+02 </max>
<!-- PDP Status -->
<last_ds> 1339488487 </last_ds>
<value> 0.0000000000e+00 </value>
<unknown_sec> 0 </unknown_sec>
</ds>
<ds> ... </ds>
Teď upravit "agregované položky" - MIN, MAX, AVG. Tzn. najít všechny výskyty
<cdp_prep> ...
a přidat další položku na danou pozici prostě COPY/PASTE té předchozí.
Poté je nutno přidat na patřičné pozice do databází nulové, resp. NaN, hodnoty.
Takže např.
<!-- 2022-05-16 21:31:00 CEST / 1652736686 -->
<row><v> 1.1266210836e+04 </v><v> 1.2273721131e+04 </v></row>
Bude nově vypadat takto
<!-- 2022-05-16 21:31:00 CEST / 1652736686 -->
<row><v> 1.1266210836e+04 </v><v> NaN </v><v> 1.2273721131e+04 </v></row>
To lze provést buď ručně (mooooc práce, chyba zaručena), nebo jako člověk pomocí sed
sed 's/v><v/v><v>NaN</v><v/X' filename.xml > filename2.xml
Kde X je pozice v><v, kam se mají NaN položky přidat
Příklad
sed 's/v><v/v><v>NaN</v><v>NaN</v><v>NaN</v><v>NaN</v><v/11' filename.xml > filename2.xml
Pak už zbývá obnovit RRD z XML a změnit práva/uživatele souboru tak, aby webová služba/REST API mohla zapisovat.
rm -rf filename.rrd
rrdtool restore filename2.xml filename.rrd
chmod 664 filename.rrd
nebo
chown webuser:webgroup filename.rrd
Hotovo, můžeme generovat a zobrazovat grafy
Všechny měřené veličiny : Weather Station Prague