Dlouhodobě používám Linux Mint 21.2 „Victoria“, který je založen na Ubuntu 22.04 LTS Jammy Jellyfish na PC UEFI, GPT particí s LVM na btrfs a chtěl jsem vyzkoušet i něco jiného, takže volba padla na instalaci openSUSE Tumbleweed v dual bootu s Mintem.
openSUSE funguje skvěle, nicméně nepočítal jsem s tím, že openSUSE přepíše původní zavaděč GRUB svým vlastním, který nebude schopen nabootovat původní Linux Mint. V nabídce GRUBu pro výběr systému se sice zobrazí, ale po potrvzení volby „Linux Mint 21.2 (on /dev/mapper/vg0-root)“ je zobrazena chyba:
error: ../../grub-core/fs/btrfs.c:2159:file '/boot/vmlinuz-5.15.0-87-generic' not found
error> ../../grub-core/loader/i386/efi/linux.c:168:you need to load the kernel first.
Press any key to continue...
Problém lze obejít nabootováním Mintu přes UEFI zavaděč v počítači, ale co je příčinou chyby?
V zavaděči GRUB přejdeme do režimu příkazové řádky stisknutím klávesy „C“ a pokračujeme příkazy, kterými zjistíme obsah disku a nastavení:
grub> ls /boot
error: ../../grub-core/fs/btrfs.c:2159:file '/boot' not found. grub> ls / @/ @home/ grub> ls /@/boot/ vmlinuz-5.15.0-87-generic initrd.img-5.15-87-generic System.map-5.15.0-87-generic grub/ efi/ vmlinuz.old grub> ls (proc) (lvm/vg0-root--os) (lvm/vg0-swap) (lvm/vg0-root) (memdisk) (hd0) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1) grub> btrfs-list-subvols (lvm/vg0-root) ID 256 path @ ID 257 path @home grub> btrfs-get-default-subvol (lvm/vg0-root) /
Z toho vyplývá, že na souborovém systému btrfs není vybrán jako výchozí subvolume @, kde je nainstalován Linux Mint. V tom případě lze zavaděč dočasně uschopnit příkazem:
Následně vyskočíme z příkazového režimu GRUBu klávesou „Esc“ a po výběru systému Linux Mint 21.2 v nabídce již úspěšně nabootuje a následuje jednoduchá oprava z příkazového řádku v systému Linux Mint:
$ sudo -i # btrfs subvolume get-default / ID 5 (FS_TREE) # btrfs subvolume list / ID 256 gen 342 top level 5 path @ ID 257 gen 341 top level 5 path @home # btrfs subvolume set-default 256 / # btrfs subvolume get-default / ID 256 gen 352 top level 5 path @
A nyní již operační systém Linux Mint bez problémů startuje volbou z nabídky openSUSE GRUBu.
Data z databáze zpracujeme, zobrazíme a analyzujeme
3. Ukládání měření do databáze
Pro sběr měřených dat je nejvhodnější databáze časových řad (TSDB – Time Series Database), protože je přizpůsobena pro optimální uložení velkého množství dat v časové řadě a pro další zpracování disponuje optimalizovanými agregačními funkcemi. Velmi často používanou databází je InfluxDB, která je zdarma i s užitečnými nástroji ke zpracování dat a díky připraveným knihovnám se s ní snadno pracuje v různých programovacích jazycích.
3.1 Instalace vlastní InfluxDB
Databázový stroj InfluxDB můžeme v oblíbeném operačním systému Debian GNU/Linux či Ubuntu/Mint Linux jednoduše nainstalovat ze standardního instalačního balíku influxdb. Případně na jiných platformách podle návodu k instalaci na webu influxdata.com.
Předpokladem je, že máme k dispozici hodně úložného prostoru, protože data mohou časem narůst do obřích rozměrů.
$ apt install influxdb
Nepotřebujeme-li zaznamenávat dotazy a přístupy přes HTTP, tak můžeme vypnout logování v konfiguračním souboru /etc/influxdb/influxdb.conf.
InfluxDB lze používat také v cloudu a zde se budeme věnovat platformě InfluxDB Cloud 2.0, která nabízí provoz připraveného databázového stroje v cloudu AWS (v Evropě Frankfurt n.M.), v Azure (v Evropě Amsterdam) nebo v Google Cloud (v Evropě Belgie).
Varianta Free je k dispozici všem zdarma s několika omezeními: zápis 5 MB za 5 vteřin, dotazy 300 MB za 5 minut, 10000 řad dat a maximálně 2 databáze (Buckets) se zachováním dat 30 dní. Pro nenáročné domácí použití naprosto dostačující.
Pro další práci s databází jsou klíčové následující kroky s poznamenáním údajů potřebných k přístupu k databázi:
Program Telegraf obsahuje modul MQTT Consumer, který pracuje jako MQTT klient zapisuje odebírané zprávy do InfluxDB. V konfiguračním souboru /etc/telegraf/telegraf.conf stačí nastavit jen pár údajů nebo si vygenerovat potřebnou konfiguraci v administraci InfluxDB Cloud.
Do souboru /etc/default/telegraf vložíme token pro přístup k databázi InfluxDB v podobě nastavení proměnné prostředí:
INFLUX_TOKEN=CkJhYmnFoWUgZG8ga2/FoWUuCgo=
Definice toku dat ve vývojovém nástroji Node-RED – tuto variantu popíšu podrobněji níže.
3.4 Node-RED jako MQTT klient zapisující data do InfluxDB
Můžeme použít vlastní instalaci prostředí Node-RED na počítači nebo v cloudu. Nejzajímavější je spuštění v IBM Cloud v rámci free tier, kde lze celé používat zdarma (stačí úroveň Lite). Instalaci provedeme po počáteční registraci podle návodu. Během instalace se pro uložení dat programu vytvoří databáze Cloudant, spustí instance aplikace Node-RED a nakonfigurují nějaké další služby potřebné pro běh prostředí.
Po přihlášení do editoru Node-RED nastavíme:
Menu / Manage palette / Install – do vyhledávacího pole zadáme influxdb a nainstalujeme doplněk node-red-contrib-stackhero-influxdb-v2
Založíme a přejmenujeme nové Flow
Vytvoříme node typu „mqtt-in“ a nastavíme:
Server (Connection – hostname, port, Use TLS; Security – uživatelské jméno a heslo)
Topic
Output – a parsed JSON object
Vytvoříme node typu „function“, pojmenujeme „toFloat“ a na záložce onMessage zadáme kód:
Jak načíst hodnoty aktuální teploty a vlhkosti z bezdrátového teploměru Xiaomi Temperature and Humidity Monitor 2 nebo podobného přes Bluetooth v TV boxu se systémem CoreELEC.
Proč zrovna v TV boxu? Protože bych rád údaje o teplotě dále zpracovával do přehledných statistik a grafů, a k tomu je zapotřebí trvale běžící zařízení, které bude naměřené údaje pravidelně přijímat, a posílat k dalšímu zpracování na MQTT broker nebo do databáze. Mobilní telefon nebo obecně Android se na to moc nehodí a jiné vhodné zařízení kompatibilní s Bluetooth 4.2 Low Energy (BLE) nemám k dispozici.
Prerekvizity
Co všechno budeme potřebovat:
Zařízení s přijímačem Bluetooth minimálně 4.2,
nainstalovaný systém CoreELEC s volným místem na paměťovém úložišti, se zapnutým SSH přístupem a s funkčním připojením k Internetu (na podobném systému LibreELEC možná bude fungovat také),
SSH terminál,
bezdrátový teploměr Xiaomi LYWSD03MMC nebo podobný s komunikačním modulem Bluetooth.
Jak zjistit, jakou verzi Bluetooth podporuje zařízení, kde chceme teplotu načítat z teploměru:
Entware je repozitář balíčků z kterého lze nainstalovat mnoho programů na jakékoliv podporované zařízení s operačním systémem založeným na Linuxu – třeba na NAS nebo WiFI router s DD-WRT. Na zařízení s CoreELEC se základní instalace Entware spustí z příkazového řádku vestavěným skriptem installentware a po restartu máme k dispozici program opkg, kterým můžeme instalovat další balíčky s programy.
$ installentware
Entware is already installed.
Příprava jazyka Python
Začneme přípravou virtuálního prostředí jazyka Python, abychom měli všechny moduly soustředěné na jednom místě a změnami neovlivnili zbytek systému.
Alternativně je možno nainstalovat novější verzi Python 3.9 z Entware. S výchozím Pythonem 3.7 v CoreELEC jsem měl potíže při výpočtech s desetinnými čísly, kdy výsledkem dělení 2347/100.0 nebylo hezkých 23.47, ale výsledek byl ošklivých 23.469999999999999, což se nepříjemně projevuje v zobrazení naměřených teplot.
Tímto máme připravené virtuální prostředí Pythonu pro další pokračování instalace.
Instalace programu lywsd03mmc
(Účelem tohoto článku není popsat jak to funguje, ale naopak zdokumentovat, co přesně nefunguje a proč, takže se předem omlouvám všem netrpělivým, že na to jdu od lesa.)
K načtení hodnot z teploměru jsem zvolil skript lywsd03mmc, který splňuje všechny požadavky. Má možnost jednorázového načtení teploty a vlhkosti nebo přečtení a uložení celé historie teplot od zapnutí teploměru do souboru CSV.
Začneme dle dokumentace s instalací vyžadované knihovny glib2 pomocí programu opkg a program pip3 slouží obecně k instalaci skriptů a modulů Pythonu.
(mitemp) $ opkg install glib2
Installing glib2 (2.68.1-3) to root...
Downloading http://bin.entware.net/aarch64-k3.10/glib2_2.68.1-3_aarch64-3.10.ipk
Installing libiconv-full (1.16-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libiconv-full_1.16-1_aarch64-3.10.ipk
Installing libintl-full (0.21-2) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libintl-full_0.21-2_aarch64-3.10.ipk
Installing zlib (1.2.11-3) to root...
Downloading http://bin.entware.net/aarch64-k3.10/zlib_1.2.11-3_aarch64-3.10.ipk
Installing libffi (3.3-2) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libffi_3.3-2_aarch64-3.10.ipk
Installing libattr (2.5.1-3) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libattr_2.5.1-3_aarch64-3.10.ipk
Configuring libiconv-full.
Configuring libintl-full.
Configuring zlib.
Configuring libffi.
Configuring libattr.
Configuring glib2.
(mitemp) $ pip3 install lywsd03mmc
Collecting lywsd03mmc
Using cached lywsd03mmc-0.1.0-py3-none-any.whl (6.4 kB)
Collecting lywsd02==0.0.9
Using cached lywsd02-0.0.9-py3-none-any.whl (4.3 kB)
Collecting bluepy==1.3.0
Using cached bluepy-1.3.0.tar.gz (217 kB)
Using legacy 'setup.py install' for bluepy, since package 'wheel' is not installed.
Installing collected packages: bluepy, lywsd02, lywsd03mmc
Running setup.py install for bluepy ... error
ERROR: Command errored out with exit status 1:
command: /storage/.venv/mitemp/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/storage/.opt/tmp/pip-install-09_n_amk/bluepy_f3934a7a656342c1a87ef752f6bc3e9b/setup.py'"'"'; __file__='"'"'/storage/.opt/tmp/pip-install-09_n_amk/bluepy_f3934a7a656342c1a87ef752f6bc3e9b/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /storage/.opt/tmp/pip-record-wbxlv4uq/install-record.txt --single-version-externally-managed --compile --install-headers /storage/.venv/mitemp/include/site/python3.7/bluepy
cwd: /storage/.opt/tmp/pip-install-09_n_amk/bluepy_f3934a7a656342c1a87ef752f6bc3e9b/
Complete output (6 lines):
running install
running build
running build_py
Working dir is /storage/.opt/tmp/pip-install-09_n_amk/bluepy_f3934a7a656342c1a87ef752f6bc3e9b
execute make -C ./bluepy clean
error: [Errno 2] No such file or directory: 'make': 'make'
----------------------------------------
ERROR: Command errored out with exit status 1: /storage/.venv/mitemp/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/storage/.opt/tmp/pip-install-09_n_amk/bluepy_f3934a7a656342c1a87ef752f6bc3e9b/setup.py'"'"'; __file__='"'"'/storage/.opt/tmp/pip-install-09_n_amk/bluepy_f3934a7a656342c1a87ef752f6bc3e9b/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /storage/.opt/tmp/pip-record-wbxlv4uq/install-record.txt --single-version-externally-managed --compile --install-headers /storage/.venv/mitemp/include/site/python3.7/bluepy Check the logs for full command output.
Instalace závislosti – pythonovského modulu bluepy – zhavarovala, protože není nainstalovaný program make, a proto ho nainstalujeme společně s překladačem a dalšími programy, které budou také potřeba pro překlad modulu z jazyka C.
(mitemp) $ opkg install make gcc
Installing make (4.3-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/make_4.3-1_aarch64-3.10.ipk
Installing gcc (7.4.0-6a) to root...
Downloading http://bin.entware.net/aarch64-k3.10/gcc_7.4.0-6a_aarch64-3.10.ipk
Installing libbfd (2.35.2-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libbfd_2.35.2-1_aarch64-3.10.ipk
Installing libopcodes (2.35.2-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libopcodes_2.35.2-1_aarch64-3.10.ipk
Installing libctf (2.35.2-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/libctf_2.35.2-1_aarch64-3.10.ipk
Installing objdump (2.35.2-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/objdump_2.35.2-1_aarch64-3.10.ipk
Installing ar (2.35.2-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/ar_2.35.2-1_aarch64-3.10.ipk
Installing binutils (2.35.2-1) to root...
Downloading http://bin.entware.net/aarch64-k3.10/binutils_2.35.2-1_aarch64-3.10.ipk
Configuring libbfd.
Configuring libopcodes.
Configuring libctf.
Configuring objdump.
Configuring ar.
Configuring binutils.
Configuring gcc.
There are no *-dev packages in Entware(with few exceptions)!
Please install headers as described in the wiki:
https://github.com/Entware/Entware/wiki
Configuring make.
Na konci jsme vyzváni k instalaci hlavičkových souborů podle popisu v dokumentaci. Ukázkový příkaz z popisu pro stažení a rozbalení hlavičkových souborů do adresáře /opt/include je pro potřeby CoreELEC zapotřebí upravit na magický příkaz:
(mitemp) $ pip3 install lywsd03mmc
...
bluepy-helper.c:33:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/attrib/att.c:33:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/attrib/gatt.c:32:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/attrib/gattrib.c:34:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/attrib/utils.c:30:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/btio/btio.c:37:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/src/log.c:38:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/src/shared/io-glib.c:30:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
./bluez-5.47/src/shared/timeout-glib.c:22:10: fatal error: glib.h: No such file or directory
#include <glib.h>
^~~~~~~~
compilation terminated.
...
Další pokus o instalaci modulu bluepy opět selhal, protože tentokrát nebyl nalezen hlavičkový soubor glib.h. Ten totiž není přímo v adresáři /opt/include, ale je v podadresáři:
Nyní se tedy vrátíme ke konfiguraci prostředí překladače a vytvoříme soubor gcc_env.sh s proměnnými definujícími, kde se má hledat hlavičkový soubor a knihovna glib-2.0. Následně vytvořený soubor použijeme před instalací nového skriptu. (Další možností by byla instalace balíku pkg-config z Entware, ale ten by vyžadoval ještě další konfiguraci, a proto jsem se touto cestou nevydal.)
(mitemp) $ cat > gcc_env.sh <<'END'
PREFIX=/opt
LIBDIR="${PREFIX}/lib"
INCLUDEDIR="${PREFIX}/include"
export LDFLAGS="-Wl,-rpath=${LIBDIR} -Wl,--dynamic-linker=${LIBDIR}/ld-linux.so.3 -L${LIBDIR} "
export CFLAGS="-O2 -pipe -march=native -fno-caller-saves "
export CPPFLAGS="${CFLAGS} -I${INCLUDEDIR} -I${INCLUDEDIR}/glib-2.0 -lglib-2.0 "
export CXXFLAGS="${CFLAGS} ${LDFLAGS} "
END
(mitemp) $ source ./gcc_env.sh && pip3 install lywsd03mmc
Collecting lywsd03mmc
Using cached lywsd03mmc-0.1.0-py3-none-any.whl (6.4 kB)
Collecting lywsd02==0.0.9
Using cached lywsd02-0.0.9-py3-none-any.whl (4.3 kB)
Collecting bluepy==1.3.0
Using cached bluepy-1.3.0.tar.gz (217 kB)
Using legacy 'setup.py install' for bluepy, since package 'wheel' is not installed.
Installing collected packages: bluepy, lywsd02, lywsd03mmc
Running setup.py install for bluepy ... done
Successfully installed bluepy-1.3.0 lywsd02-0.0.9 lywsd03mmc-0.1.0
Nyní je skript lywsd03mmc se všemi potřebnými moduly úspěšně nainstalovaný a můžeme ho vyzkoušet k načtení hodnot z teploměru s MAC adresou, kterou jsme zjistili na začátku tohoto článku.
(mitemp) $ lywsd03mmc A4:C1:38:98:76:54
Fetching data from A4:C1:38:98:76:54
Temperature: 24.36°C
Humidity: 61%
Battery: 89%
Nebo můžeme uložit historii teplot od zapnutí teploměru do CSV souboru k dalšímu zpracování.
(mitemp) $ lywsd03mmc2csv A4:C1:38:98:76:54 --output data.csv
Fetching data from A4:C1:38:98:76:54
Temperature: 24.36°C
Humidity: 61%
Battery: 89%
Device start time: 2021-07-22 18:39:52.948031
Fetching history from A4:C1:38:98:76:54
2021-07-22 19:39:52.948031: 24.1 to 26.8
2021-07-22 20:39:52.948031: 24.1 to 24.2
2021-07-22 21:39:52.948031: 23.7 to 24.1
2021-07-22 22:39:52.948031: 23.4 to 23.7
2021-07-22 23:39:52.948031: 23.3 to 23.8
...
Done
Data z databáze zpracujeme, zobrazíme a analyzujeme
V předchozím díle jsme si ukázali, jak měřit a sbírat údaje. Nyní plynule navážeme a představíme si jak údaje odesílat k dalšímu zpracování.
2. Odesílání dat protokolem MQTT
Je několik možností co dělat s naměřenými hodnotami. Budeme se zabývat pouze dvěma, a to odesláním na vlastní MQTT broker, který poběží na nějakém našem počítači a použitím MQTT brokeru v cloudu, abychom se o jeho provoz nemuseli starat. MQTT broker přijímá data a rozesílá přihlášeným odběratelům. Podrobnosti viz Co je MQTT na webu RoboDoupě.
2.1 Vlastní MQTT broker – Eclipse Mosquitto™
Mosquitto můžeme stáhnout a nainstalovat podle návodu z webu https://mosquitto.org/, a nebo ve většině distribucích Linuxu je k dispozici balíček pro jednoduchou instalaci:
$ apt install mosquitto
Po instalaci je nutné upravit základní konfiguraci s nastavením uživatelů a jejich oprávnění v konfiguračních souborech v adresáři /etc/mosquitto.
Zapnutí samostatné konfigurace pro každý druh komunikace:
# soubor /etc/mosquitto/conf.d/default.conf
per_listener_settings true
Konfigurace pro protokol MQTT – povolení anonymního připojení a definice souboru s přístupovými právy.
HiveMQ provozuje veřejný MQTT broker nebo po registraci lze využít službu MQTT Cloud Broker v základní variantě zdarma (do 100 připojených klientů a 10 GB dat měsíčně, uchování dat 3 dny). Založení služby nabízí u poskytovatele AWS v Irsku a Azure ve Frankfurtu n.M.
Použití je velmi jednoduché – potřebné přihlašovací údaje jsou přehledně uvedeny na jedné stránce a je možné vytvořit několik různých uživatelů u kterých ale bohužel nelze omezit oprávnění. Nechybí podrobná nápověda jak službu použít z různých klientů a programovacích jazyků.
2.3 Odeslání a příjem datových zpráv MQTT
2.3.1 Programy mosquitto_pub a mosquitto_sub
Na spoustě Linuxových distribucí jsou v balíčku mosquitto-clients.
$ apt install mosquitto-clients
Odeslání zprávy na MQTT broker do tématu mereni/teplota:
Skript mqtt-client pro odesílání zpráv na MQTT broker (v tomto případě HiveMQ Cloud):
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time
import sys
import re
broker = dict(
HOST = '42616269c5a14a655a6c6f64c49b6a.s2.eu.hivemq.cloud',
PORT = 8883,
USER = 'kralicek-itacek',
PASS = '***heslo***'
)
def on_connect(client, userdata, flags, rc):
if rc == 0:
print('Connected successfully ' + str(mqtt.connack_string(rc)))
else:
print('Connect returned result code: ' + str(rc) + ' ' + str(mqtt.connack_string(rc)))
def on_disconnect(client, obj, rc):
if rc == 0:
print('Disconnected')
else:
print('Unexpected disconnection code: ' + str(rc) + ' ' + str(mqtt.error_string(rc)))
def on_message(client, userdata, msg):
print('Received message: ' + str(msg.topic) + ' ' + str(msg.payload.decode('utf-8')))
def main():
client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
client.username_pw_set(broker['USER'], broker['PASS'])
x = client.connect(broker['HOST'], broker['PORT'], 60)
client.loop_start()
# client.subscribe("#") # debug
for line in sys.stdin:
m = re.match('(.*)=(.*)', line)
if m:
p = client.publish(m.group(1), payload=m.group(2))
p.wait_for_publish()
client.loop_stop()
time.sleep(2)
client.disconnect()
if __name__ == '__main__':
main()
Skript po spuštění očekává zadání dat v níže uvedeném formátu a po zadání znaku konce řádku (Enter na klávesnici) hodnoty odesílá jako zprávy na MQTT broker. Ukončuje se zadáním znaku konce souboru EOF (na klávesnici Ctrl+D).
Data z databáze zpracujeme, zobrazíme a analyzujeme
1. Měření a získání naměřených dat počítačem
V našem okolí se dají pomocí speciálních čidel měřit rozmanité údaje. Od teploty, vlhkosti a tlaku vzduchu, přes měření teploty vody v zahradním jezírku nebo v kotli či bojleru, spotřebu elektřiny a vody, až po cokoliv nás napadne.
Pro začátek se můžeme spokojit s údaji, které jdou měřit v počítači nebo v jednodeskovém počítači typu Raspberry Pi s operačním systémem Linux. Osobně nejvíc používám Debian GNU/Linux, Ubuntu, Linux Mint, Armbian a CoreELEC, ale to záleží na osobním vkusu každého soudruha.
Účelem tohoto článku je v podstatě zdokumentovat základy realizovaného řešení a měřením v jiných operačních systémech se proto nezabývá.
Teplota procesoru a vzduchu ve skříni, počet otáček ventilátoru a hodnoty napětí programem sensors z balíku lm-sensors.
Pro automatizované zpracování dat jsou užitečné přepínače -u pro vypsání v jednoduchém formátu či -j pro vypsání ve formátu json.
Teplota pevného disku nebo SSD programem smartctl z balíku smartmontools.
Přepínač -n sleep zabrání probuzení uspaného disku a přepínačem -l scttempsts se získá teplota i uspaného disku (před uspáním).
Při použití přepínače -A, který zobrazí S.M.A.R.T. data včetně teploty, se uspané disky probouzí. Pravidelné čtení těchto dat zabraňuje uspávání disků po nastavené době nečinnosti (programem hdparm -S<timeout>), takže používat až po jejich přechodu do úsporného režimu (zjištění programem hdparm -C).
$ smartctl -n sleep -l scttempsts /dev/sda
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-77-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF READ SMART DATA SECTION ===
SCT Status Version: 3
SCT Version (vendor specific): 1 (0x0001)
Device State: Active (0)
Current Temperature: 21 Celsius
Power Cycle Min/Max Temperature: 18/21 Celsius
Lifetime Min/Max Temperature: -2/63 Celsius
Specified Max Operating Temperature: 55 Celsius
Under/Over Temperature Limit Count: 0/0
Vypsání pouze aktuální teploty disku pomocí awk skriptu:
$ digitemp_DS9097 -i -s /dev/ttyS0 # uložení konfigurace do .digitemprc
DigiTemp v3.7.2 Copyright 1996-2018 by Brian C. Lane
GNU General Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
..
Searching the 1-Wire LAN
281234E000000001 : DS18B20 Temperature Sensor
286789E000000099 : DS18B20 Temperature Sensor
ROM #0 : 281234E000000001
ROM #1 : 286789E000000099
Wrote .digitemprc
$ digitemp_DS9097 -a # načtení hodnot všech čidel
DigiTemp v3.7.2 Copyright 1996-2018 by Brian C. Lane
GNU General Public License v2.0 - http://www.digitemp.com
Jul 20 17:35:10 Sensor 0 C: 23.25 F: 73.85
Jul 20 17:35:11 Sensor 1 C: 22.44 F: 72.39
Vypsání pouze naměřené teploty ve °C jednotlivých teploměrů:
Koncem dubna mi poskytovatel virtuálního serveru oznámil, že bude provoz služby na konci předplaceného období ukončen a nabídl zvýhodněný přechod na jinou službu, a to více jak 5× dražší, což jsem nemohl akceptovat, protože VPS mám hlavně na hraní a provoz neziskových webových stránek, který dotuji z vlastní kapsy a platit bezmála 315 Kč měsíčně je cenově nevýhodné. Porozhlédl jsem se tedy po vhodné náhradě se stanovenými měsíčními náklady maximálně 100 Kč.
Porovnání původní služby s alternativami v přehledné tabulce:
Součástí služby VPS Lite byla velmi užitečná funkce zálohování automatickým vytvořením snapshotu každou noc, které se uchovávaly poslední tři a výhoda umístění v datacentru v Praze (velmi malá latence/RTT). Nevýhodou byl malý výkon CPU.
U Forpsi Cloud je velká nevýhoda nemožnosti manuálního spuštění instalace operačního systému — raději volím rozdělení disku a souborový systém sám a v budoucnu to znemožní nastartování z vlastního ISO obrazu pro případné záchranné práce, ale libí se mi vytvoření snapshotu zdarma, což se hodí třeba před velkým upgradem operačního systému. Matoucí je nejednotná administrace, která je rozdělena na tři aplikace a musí se přemýšlet, do které se přihlásit — 1. administrace domén a webhostingu, 2. administrace Cloudu a 3. dobíjení kreditu.
U Hukot se mi nejvíc líbí nastavení firewallu u poskytovatele, který zablokuje zbytečnou komunikaci na VPS a velká kapacita RAM, kterou ale nevyužiji, poněvadž doteď stačila pro provoz mailserveru postfix a webserveru nginx se statickými webovými stránkami čtvrtinová (a aktivně využitá byla kolem 80 MB). Během testování VPS bohužel došlo 31.5.2021 po 16. hodině asi na 20 minut k celkové nedostupnosti VPS a nezobrazila se ani webová stránka hostingu. Po opravení jsem pátral co se stalo, ale na stránce statusu hostingu vesele svítilo „Všechny systémy funkční“ a dostupnost SLA 100 %, což ve mě velkou důvěru nevzbudilo.
Ostatní parametry jsou víceméně podobné nebo na nich moc nezáleží. Zajímavější bude změřit reálný výkon VPS a zjistit jak velký je mezi nimi rozdíl.
Orientační výkon VPS byl zjištěn pomocí jednoduchých testů a pro zajímavost je tu porovnání výkonu s virtuálním serverem zdarma (v rámci OracleCloud Free Tier) a 12 let starým desktop PC s CPU Intel Core2 Duo 6700 @2.66 GHz a první generací SSD.
Z měření rychlosti vyplývá, že VPS Lite je extrémně přiškrcený, Hukot používá starší/horší/pomalejší CPU než Forpsi a nejrychlejší je dvanáct let staré pécéčko i při uvažování rychlosti pouze jednoho jádra CPU.
A pokud se ptáte, proč tu není VPS otestovaných víc, tak jsem jiné služby pod 100 Kč měsíčně nezkoušel a nenašel.
Na jakých frekvencích lze naladit multiplexy digitálního televizního vysílání z vysílačů DVB-T2 v Praze.
Vyžaduje přijímač s tunerem podporujícím demodulaci DVB-T2 a dekodérem komprese H.265 HEVC.
Nova, Nova 2, Nova Action, Nova Gold, JOJ Family, Prima Comedy Central, Sport 5, Rebel, Relax, Retro Music TV, Šlágr TV, CS Mystery, ABC TV, Galerie, Klenot TV
Prima Love, Prima Zoom, Prima Max, Barrandov TV, Kino Barrandov, Barrandov Plus, Óčko Star, Šlágr TV, Óčko, Prima, Prima Cool, Barrandov Family, Noe TV, Šlágr 2, Nova Cinema, Nova, Seznam.cz TV, Prima Krimi
Kolik stojí registrace nebo obnovení platnosti české domény .CZ na 1 rok u certifikovaných registrátorů?
Novinka! Od 1.1.2019 zdražilo sdružení CZ.NIC velkoobchodní cenu domény .cz ze 125 Kč na 145 Kč bez DPH, a proto zvýšili cenu o 20 až 74 Kč i následující registrátoři.
* Ceny označené hvězdičkou jsou s akční slevou, která může mít omezenou platnost.
Šipka za jménem registrátora naznačuje trend vývoje počtu zaregistrovaných domén.
Ceny u ostatních akreditovaných registrátorů
Následuje přehled cen u dalších akreditovaných registrátorů, kteří poskytují registraci domén zpravidla ve spojitosti s poskytováním služby webhostingu.
* Ceny označené hvězdičkou jsou s akční slevou, která může mít omezenou platnost.
Kde zaplatím nejméně?
Nejlevnější registraci nebo prodloužení domény .cz v současné době nabízí služby Forpsi, OVH a Wedos (za cenu od 175 Kč do 180,29 Kč s DPH).
Ceník byl naposledy upraven na základě informací z webových stránek uvedených registrátorů ke dni 13. ledna 2019 a je pravidelně aktualizovaný.
V novějších verzích Oracle VM VirtualBox 5 jsem měl problémy s velmi pomalu běžícím časem ve virtuálních počítačích, kdy virtualizovaný systém ukazoval jiný čas než byl ve skutečnosti. Týkalo se to virtualizovaných Windows XP i různých verzí Linuxu od Debian 7, Debian 8, Ubuntu 16.04 i CentOS 6 či 7. Čas se neustále zpožďoval asi o třetinu až polovinu proti reálnému času. Po delším čase tedy došlo k rozdílu oproti normálnímu času o několik minut.
Po různém hledání na internetu, kdy jsem byl ujištěn, že v tom nejsem sám, se objevila jedna zřejmá příčina a několik způsobů řešení.
Špatné plynutí času ve virtualizovaném operačním systému má na svědomí tzv. paravirtualizace, kdy se část práce systému přenáší na hostitelský operační systém. Možné řešení je tedy toto:
V nastavení virtuálního počítače (jde změnit pouze pokud je vypnutý) je nutné vypnout paravirtualizaci nebo přepnout do minimálního režimu volbou „Systém » Akcelerace – Rozhraní paravirtualizace“ nastavení „Minimální“ nebo „Žádné“.
Při instalaci každé nové verze VirtualBoxu je vhodné ve virtuálních strojích aktualizovat tzv. Přídavky pro hosta dodávané s novou verzí VirtualBoxu. Spouští se připojením ISO obrazu VBoxGuestAdditions.iso přes nabídku „Zařízení » Vložit obraz CD disku s přídavky pro hosta…“ po spuštění VM. V operačním systému se potom objeví CD, ze kterého je potřeba spustit instalační program a projít instalací. Ve Windows to bude instalátor VBoxWindowsAdditions.exe a v Linuxu instalační skript VBoxLinuxAdditions.run. Tato aktualizace mi pomohla zejména ve Windows XP, ale je pravděpodobné, že virtualizované Windows 7, 8 nebo Windows 10 budou také fungovat lépe.
Po restartu virtuálního počítače by měl být čas již stejný jako na hostitelském systému.
Aktuální délka fronty na vyřízení žádosti a vydání Lítačky (od března 2016 nová síťová jízdenka nebo též tramvajenka místo Opencard) a statistika s časovým vývojem za posledních 7 dnů.
Dlouhodobě sledujeme délku fronty na Lítačku u 11 přepážek ve Škodově paláci v Praze (ulice Jungmannova) ve všední dny od pondělí do pátku v běžné otevírací době od 8.00 do 18.00 hodin a zobrazujeme graf počtu čekajících v časovém období za poslední hodinu, 24 hodin a za posledních 7 dnů. Bylo to dobré k naplánování vhodného času návštěvy zákaznického centra v počátcích zavádění Lítačky do užívání v roce 2016, kdy fronty čítaly stovky čekajících, což znamenalo několikahodinové čekání.
Dlouhá fronta může být ve skutečnosti kratší a postupovat rychleji, protože záleží na trpělivosti čekajících, počtu otevřených přepážek a rychlosti odbavení (pokud je narváno, tak by se doba vyřízení měla zrychlovat).
Průměrná doba čekání v minutách není zatím k dispozici, ale v dohledné době plánujeme přidat alespoň neoficiální kvalifikovaný odhad.
Během července 2016 bylo pro expresní vydání nejvhodnější přijít ráno před devátou, po sedmé večer nebo ve čtvrtek a pátek.
Od srpna 2016 je již možné objednat Lítačku elektronicky přes internet a na přepážce je vydání karty zpoplatněno, takže na přepážky již nechodí tolik lidí a je možné přijít kdykoliv. Kromě pondělků není většinou fronta delší než pár osob s maximem kolem 25. Od roku 2017 nejsou fronty nijak zvlášť dlouhé a doba čekání je obvykle několik minut.
Pokud náhodou žádné grafy nevidíte, tak asi máte zrovna smůlu a něco se pokazilo. Máte-li v prohlížeči vypnutý JavaScript, tak ho zkuste zapnout nebo na této stránce všechen povolit a neblokovat.