Protokolování dat z Raspberry Pi do InfluxDB

17.11.2023 Raspberry Pi #raspberrypi #influxdb #enviro

V tomto článku je uvedeno, jak odesílat data z Raspberry Pi Zero W s deskou Pimoroni Enviro do databáze InfluxDB a jak nastavit řídicí panel Grafana pro zobrazení dat.


Databáze InfluxDB a řídicí panel Grafana nemusí samozřejmě běžet na Raspberry Pi, mohou samozřejmě běžet na jiném serveru u vás doma nebo dokonce na vzdáleném serveru.

Výhody odesílání tohoto druhu dat do databáze namísto pouhého protokolování do textového souboru spočívají v tom, že:

  1. usnadňuje využití výkonných grafických funkcí Grafany,
  2. analýza dat pomocí nástrojů jako R je přímočará. a
  3. zálohování a obnova dat je triviální.

Podíváme se na to, jak logovat data z desky Pimoroni Enviro (na Raspberry Pi Zero W), ale není důvod, aby to nemohlo být jiné čidlo nebo čidla, např. čidlo oxidu uhličitého, UV čidlo, popř. To je jedno. Kód a principy, které se zde naučíte, jsou stejně použitelné pro jiné typy senzorů.

Náš kód se spustí v 5-ti minutových intervalech a zaznamenává data do naší databáze InfluxDB. Zaznamená se teplota, vlhkost, tlak a úroveň osvětlení. Zjistil jsem, že frekvence 5 minut vám poskytuje slušné množství granularity, aniž byste generovali ohromující množství dat.

Co budete potřebovat

Komponenty pro práci:

Lze provést celé nastavení tak, ženení potřeba žádný displej, klávesnice ani myš.

Předpokládá se, že je nainstalován systém na Raspberry Pi.

Nasaďte desku Enviro na GPIO piny vašeho Raspberry Pi Zero W, vložte micro SD kartu do vašeho Pi a zapojte napájecí zdroj. Zelená LED dioda aktivity by se měla rozsvítit a blikat, aby signalizovala, že se vaše Pi spouští.

Instalace knihoven Enviro plus a InfluxDB Python

Pro čtení dat ze snímače teploty, vlhkosti a tlaku BME280 a světelného snímače LTR559 na desce Enviro budeme muset nainstalovat knihovnu Enviro plus Python od Pimoroni, která nainstaluje požadované ovladače pro snímače. Budeme také potřebovat knihovnu InfluxDB Python, která nám umožní posílat hodnoty načtené ze senzorů přímo do naší databáze InfluxDB.

Otevřete terminál na svém počítači a připojte se přes SSH k Raspberry Pi Zero W zadáním ssh pi@enviro.local nebo ssh pi@192.168.0.101, nahraďte název hostitele nebo IP adresu jakýmkoli názvem hostitele nebo IP adresou vašeho Raspberry Pi Zero W. Stejně jako u návodu InfluxDB důrazně doporučuji, abyste pro Raspberry Pi Zero W nastavili statickou IP adresu v nastavení DHCP routeru. Díky tomu bude připojení k vašemu Zero W přes SSH mnohem jednodušší.

Jakmile zadáte heslo SSH (to, které jste nastavili při předchozím nastavení karty micro SD), měli byste být připojeni k terminálu Raspberry Pi Zero W. Chcete-li stáhnout všechny nejnovější změny balíčků na vašem Pi, než budeme pokračovat a nainstalujeme knihovny Pythonu, zadejte následující příkazy:

sudo apt update
sudo apt upgrade -y

Dále zadejte následující pro klonování knihovny Enviro plus Python a její instalaci:

git clone https://github.com/pimoroni/enviroplus-python
cd enviroplus-python
sudo ./install.sh

Po dokončení zadejte následující, abyste nainstalovali knihovnu InfluxDB Python a restartovali Pi, abyste se ujistili, že se vše projeví:

sudo pip3 install influxdb
sudo reboot

To je vše nastaveno z hlediska knihoven Pythonu. Dále se podíváme na program, který načte data senzoru a odešle je do vaší databáze InfluxDB.

Protokolování dat do databáze InfluxDB

Podívejme se na program, který bude číst hodnoty senzorů a zapisovat je do vaší databáze InfluxDB.

Kód by měl být samovysvětlující. Přidal jsem Change this as necessary komentáře, kde byste měli změnit IP adresy, uživatelská jména, hesla a tak dále, aby odpovídaly těm vašim.

Je opravdu důležité, abyste získali správnou IP adresu (proměnná host níže), uživatelské jméno, heslo a název databáze (proměnná db níže) a odpovídali tomu, co jste si vybrali při nastavování databáze InfluxDB.

#!/usr/bin/env python3

import time
import datetime

from bme280 import BME280
from ltr559 import LTR559

from influxdb import InfluxDBClient

try:
    from smbus2 import SMBus
except ImportError:
    from smbus import SMBus


# Logs the data to your InfluxDB
def send_to_influxdb(measurement, location, timestamp, temperature, pressure, humidity, light):
    payload = [
         {"measurement": measurement,
             "tags": {
                 "location": location,
              },
              "time": timestamp,
              "fields": {
                  "temperature" : temperature,
                  "humidity": humidity,
                  "pressure": pressure,
                  "light": light
              }
          }
        ]
    client.write_points(payload)


# Corrects the relative humidity given a raw and corrected temperature reading
def correct_humidity(humidity, temperature, corr_temperature):
    dewpoint = temperature - ((100 - humidity) / 5)
    corr_humidity = 100 - (5 * (corr_temperature - dewpoint)) - 20
    return min(100, max(0, corr_humidity))


# Set up the BME280 weather sensor
bus = SMBus(1)
bme280 = BME280(i2c_dev=bus)
bme280.setup(mode="forced")

time.sleep(5)

# Set up the light sensor
ltr559 = LTR559()

# Set up InfluxDB
host = '192.168.0.100'  # Change this as necessary
port = 8086
username = 'grafana'  # Change this as necessary
password = 'grafana'  # Change this as necessary
db = 'home'  # Change this as necessary

# InfluxDB client to write to
client = InfluxDBClient(host, port, username, password, db)

measurement = "indoor"  # Change this as necessary
location = "living_room"  # Change this as necessary

timestamp = datetime.datetime.utcnow()

# Read temperature (read twice, as the first reading can be artificially high)
temperature = bme280.get_temperature()
time.sleep(5)
temperature = bme280.get_temperature()

# Calculate corrected temperature
offset = 7.5
corr_temperature = temperature - offset

# Read humidity and correct it with the corrected temperature
humidity = bme280.get_humidity()
corr_humidity = correct_humidity(humidity, temperature, corr_temperature)

# Read pressure
pressure = bme280.get_pressure()

# Read light
light = ltr559.get_lux()

# Log the data
send_to_influxdb(measurement, location, timestamp, corr_temperature, pressure, corr_humidity, light)

Důležitá poznámka: protože deska Enviro je přímo nad vaším Raspberry Pi Zero W, a tedy přímo nad jeho CPU, budou hodnoty teploty a vlhkosti ovlivněny teplem vyzařovaným z Raspberry Pi. Důrazně doporučuji použít digitální teploměr umístěný vedle vašeho Raspberry Pi a desky Enviro ke kalibraci odečtů teploty úpravou hodnoty offset podle potřeby, dokud nebudou naměřené teploty přesné. V mém případě hodnota offsetu 7,5 poskytuje přesné údaje.

Tento program byste měli uložit jako něco podobného log_to_influxdb.py a poté jej zkopírovat pomocí scp do vašeho Raspberry Pi Zero W s deskou Enviro následujícím způsobem v novém okně terminálu:

scp log_to_influxdb.py pi@192.168.0.101:~/

Tím se program zkopíruje do domovského adresáře vašeho Raspberry Pi Zero W. Jen se ujistěte, že jste nahradili název souboru tím, co jste nazvali soubor (pokud se lišil od mého návrhu) a změňte IP adresu tak, aby odpovídala IP adrese vašeho Raspberry Pi Zero W.

Použití cronu k protokolování dat každých 5 minut

Namísto toho, aby náš program běžel nepřetržitě a museli sledovat čas, abychom zjistili, kdy odeslat data, použijeme bash program cron ke spuštění našeho programu Python v 5-ti minutových intervalech.

Připojte se k Raspberry Pi Zero W přes SSH v terminálu, jako jste to dělali dříve.

Zadejte crontab -e a upravte svůj crontab, seznam příkazů, které cron automatizuje. Budete požádáni, abyste vybrali editor, který chcete použít, pokud to děláte poprvé. Rád používám nano.

Jakmile jste v crontab, pomocí kláves se šipkami přejděte dolů a přidejte řádek níže, aby se program spouštěl log_to_influxdb.py každých 5 minut, takže váš soubor crontab bude vypadat takto:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
*/5 * * * * cd /home/pi; /usr/bin/python3 log_to_influxdb.py &

Chcete-li ukončit nano a uložit soubor, stiskněte control-x, potom y a potom enter.

Váš log_to_influx.db.py program nyní poběží každých 5 minut: každou hodinu, pět minut, deset atd.

Nastavení řídicího panelu na Grafaně pro zobrazení dat

Posledním úkolem je nastavit dashboard v Grafaně, který nám umožní vidět data, která nyní přidáváme do databáze InfluxDB. Podíváme se na to, jak přidat jednu pro údaje o teplotě a poté ji můžete replikovat pro další tři proměnné.

Otevřete webový prohlížeč na svém počítači a otevřete svůj řídicí panel Grafana tak, že přejdete na http://192.168.0.100:3000 nebo http://influxdb.local:3000, přičemž IP adresu nebo název hostitele nahradíte tím, co je vhodné pro vaše nastavení.

Klikněte na ikonu „+“ na levém postranním panelu a poté kliknutím na „Dashboard“ vytvořte nový panel. Vlevo nahoře byste měli vidět stránku s rámečkem, který vám dává možnost vytvořit nový panel. Klikněte na „Přidat prázdný panel“.

Nyní byste měli vidět okno „Edit Panel“, kde můžete nakonfigurovat panel výběrem zdroje dat, stylingem grafu mnoha různými způsoby a dalšími. Naštěstí, místo abyste museli zadávat složitý dotaz, abyste vybrali, která data z databáze chcete zobrazit, existuje grafický editor, ve kterém můžete svůj dotaz sestavit.

Klikněte na pole „select_measurement“ a měli byste vidět pouze jednu možnost, „indoor“ nebo cokoli, co jste measurement log_to_influx_db.py programu nastavili jako svou proměnnou. Klikněte na „+“ za „KDE“ a vyberte „umístění“ a poté klikněte na „vybrat hodnotu tagu“ a vyberte „obývací pokoj“ nebo cokoli, co nastavíte jako proměnnou location v programu.

Na řádku „SELECT“ klikněte na „pole (hodnota)“ a poté vyberte „teplota“. Nyní byste měli na grafu vidět nějaké body! Rád používám klouzavý průměr, abych trochu vyhladil své grafy, a můžete to udělat kliknutím na „+“ po „mean()“ a následným výběrem „moving_average“ pod „Transformations“. K tomu používám hodnotu 5 a můžete ji změnit z výchozích 10 kliknutím na 10 v závorkách.

Není příliš důležité, zda máte pouze jedno umístění, ale také se mi líbí „GROUP BY“ „tag(location)“, který seskupuje data, pokud začnete přidávat více senzorů na různých místech. Také jsem přidal alias „Obývací pokoj“, aby legenda pod grafem vypadala rozumněji.

Nakonec použijte panel na pravé straně ke konfiguraci vzhledu a chování grafu, dejte mu název, označte své osy (VŽDY OZNAČTE SVÉ OSY!), vyberte správné jednotky a tak dále. Nebudu procházet všemi způsoby, kterými jsem stylizoval svůj graf, protože mnoho z nich závisí na vaší osobní volbě.

Až budete hotovi, klikněte na „Použít“ vpravo nahoře a panel uložte.

Nyní byste také měli uložit svůj nový řídicí panel kliknutím na ikonu malé diskety v horní liště a zadáním názvu řídicího panelu (nazval jsem svůj „Indoor“).

Takto vypadal můj přístrojový panel po přidání všech ostatních měření senzoru: