Raspberry Pi

MQTT Sensör Verileri İçin Raspberry Pi Grafana InfluxDB Kurulumu

64 bit Raspberry Pi üzerine InfluxDB 2, Telegraf ve Grafana kurun, Telegraf'ı bir MQTT broker'a abone edin, sensör okumalarını zaman serisi olarak saklayın ve Grafana'da grafiğe dökün.

MQTT sensörleriyle beslenen raspberry pi grafana influxdb yığınını çalıştıran bir Raspberry Pi'ye bağlı monitörde Grafana paneli
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Raspberry Pi Grafana InfluxDB yığını, aylarca süren sensör geçmişini kontrolünüzdeki küçük ve sessiz bir bilgisayarda tutmanın en pratik yollarından biridir. Bu eğitimde 64 bit bir Raspberry Pi üzerine InfluxDB 2, Telegraf ve Grafana kuracak, Telegraf'ın bir MQTT broker'a abone olmasını sağlayacak ve yeni okumalar geldikçe güncellenen bir Grafana paneli oluşturacaksınız. Her komut ve yapılandırma dosyası eksiksizdir; böylece sıfırdan kurulmuş bir Pi üzerinde adım adım ilerleyebilirsiniz.

Mimari: Kim Kiminle Konuşuyor

Herhangi bir şey kurmadan önce veri yolunu netleştirmek faydalıdır, çünkü kurulumların çoğu tam da burada ters gider:

  1. Sensörler (ESP32 kartları, Pico W düğümleri, diğer Pi'ler) bir MQTT broker'a JSON yayınlar.
  2. Pi üzerindeki Telegraf, bu broker'a sıradan bir MQTT istemcisi olarak bağlanır, sensör topic'lerine abone olur ve JSON'u ayrıştırır.
  3. Telegraf, ayrıştırılan alanları aynı Pi üzerindeki bir InfluxDB 2 bucket'ına yazar.
  4. Grafana, InfluxDB'yi sorgular ve panelleri çizer.

Broker'ın kendisi bir veritabanına yazmaz. Yalnızca mesajları yönlendirir. Bu rolü tazelemek isterseniz bir MQTT broker'ın ne yaptığını okuyun. Burada broker bulutta yaşar; bu da başka binalardaki sensörlerin ona yayın yapabileceği, Pi'nizin ise yalnızca dışa doğru bir bağlantıya ihtiyaç duyacağı anlamına gelir. Port yönlendirme yok, dinamik DNS yok.

Bileşen Rol Pi üzerindeki varsayılan port
MQTT broker (bulut) Sensör mesajlarını alır ve yönlendirir Pi üzerinde yok
Telegraf MQTT abonesi ve JSON ayrıştırıcı Yok (yalnızca dışa doğru)
InfluxDB 2 Zaman serisi depolama 8086
Grafana Paneller ve uyarı arayüzü 3000

Gereksinimler

  • En az 2 GB RAM'e sahip Raspberry Pi 4 veya 5. Bir Pi 3 çok hafif yükler için çalışabilir ama sınırda kalır.
  • Raspberry Pi OS 64 bit (Bookworm). InfluxDB 2 paketleri arm64 için derlenmiştir, bu yüzden 32 bit imaj işe yaramaz.
  • USB 3 üzerinden bir SSD şiddetle tavsiye edilir. Zaman serisi veritabanları sürekli yazar ve SD kartlar yıpranır.
  • MQTT üzerinden zaten yayın yapan bir sensör. Yoksa, Raspberry Pi sistem istatistikleri eğitimi Pi'nin kendisini beş dakikada bir veri kaynağına dönüştürür.

Önce mimariyi doğrulayın:

uname -m          # should print aarch64
cat /etc/os-release | grep VERSION_CODENAME

InfluxDB 2 ve Telegraf'ı Kurun

Her ikisi de InfluxData paket deposundan gelir. İmzalama anahtarını ve depoyu ekleyin, ardından kurun:

sudo apt update && sudo apt install -y curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://repos.influxdata.com/influxdata-archive.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/influxdata-archive.gpg
echo "deb [signed-by=/etc/apt/keyrings/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main" \
  | sudo tee /etc/apt/sources.list.d/influxdata.list
sudo apt update
sudo apt install -y influxdb2 influxdb2-cli telegraf
sudo systemctl enable --now influxdb

Tek seferlik kurulumu çalıştırın. Bu adım organizasyonu, ilk bucket'ı ve yönetici kullanıcıyı oluşturur. SD kartınızın veya SSD'nizin kapasitesine uygun bir saklama süresi seçin; oda sensörleri için 90 gün makul bir başlangıç noktasıdır.

influx setup \
  --org home \
  --bucket sensors \
  --username admin \
  --password 'change-this-long-password' \
  --retention 90d \
  --force

Şimdi yönetici token'ını yeniden kullanmak yerine Telegraf için özel bir token oluşturun. En az yetki ilkesi ev ağında bile önemlidir:

influx auth create --org home --read-buckets --write-buckets \
  --description "telegraf writer"

Çıktıdaki token'ı kopyalayın. Bir sonraki adımda onu Telegraf yapılandırmasına koyacaksınız.

Telegraf'ı MQTT'ye Abone Olacak Şekilde Yapılandırın

Telegraf devasa bir örnek yapılandırmayla gelir. Tam olarak ne yaptığını görebilmek için onu odaklı bir yapılandırmayla değiştirin. Benzersiz bir client ID ve benzersiz bir topic öneki kullanın; test sırasında broker.connectmq.com adresindeki genel MQTT test broker'ı hesap gerektirmeden çalışır.

sudo mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf.sample
sudo nano /etc/telegraf/telegraf.conf
[agent]
  interval = "10s"
  flush_interval = "10s"
  omit_hostname = true

[[inputs.mqtt_consumer]]
  servers = ["tcp://broker.connectmq.com:1883"]
  client_id = "telegraf-pi-4b21c9"
  topics = ["connectmq/demo/4b21c9/+/climate"]
  qos = 1
  persistent_session = false
  data_format = "json_v2"

  [[inputs.mqtt_consumer.topic_parsing]]
    topic = "connectmq/demo/4b21c9/+/climate"
    tags = "_/_/_/room/_"

  [[inputs.mqtt_consumer.json_v2]]
    measurement_name = "climate"
    [[inputs.mqtt_consumer.json_v2.field]]
      path = "t"
      rename = "temperature"
      type = "float"
    [[inputs.mqtt_consumer.json_v2.field]]
      path = "rh"
      rename = "humidity"
      type = "float"

[[outputs.influxdb_v2]]
  urls = ["http://127.0.0.1:8086"]
  token = "PASTE_THE_TELEGRAF_TOKEN_HERE"
  organization = "home"
  bucket = "sensors"

topic_parsing bloğu, dördüncü topic seviyesini bir room etiketine dönüştürür; böylece connectmq/demo/4b21c9/kitchen/climate üzerindeki bir mesaj room=kitchen etiketli bir noktaya dönüşür. Etiketler InfluxDB'de indekslenir ve bu da oda bazlı sorguları hızlandırır. Daha fazla ayrıştırıcı seçeneği için Telegraf MQTT consumer rehberine bakın.

Servisi başlatın ve günlüğünü izleyin. Telegraf bağlantı ve ayrıştırma hatalarını oraya yazar; bu, tahmin yürütmekten çok daha kolaydır:

sudo systemctl enable --now telegraf
sudo journalctl -u telegraf -f

Herhangi bir makineden test okuması yayınlayın:

mosquitto_pub -h broker.connectmq.com -p 1883 -i tester-4b21c9 -q 1 \
  -t connectmq/demo/4b21c9/kitchen/climate \
  -m '{"t":21.7,"rh":48.2}'

Ardından noktanın yerine ulaştığını doğrulamak için InfluxDB'yi doğrudan sorgulayın:

influx query --org home \
  'from(bucket:"sensors") |> range(start:-10m) |> filter(fn:(r) => r._measurement == "climate")'

room=kitchen içeren satırlar görüyorsanız, veri alma yarısı tamamdır.

Grafana'yı Raspberry Pi'ye Kurun

Grafana kendi arm64 deposunu yayınlar:

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://apt.grafana.com/gpg.key \
  | sudo gpg --dearmor -o /etc/apt/keyrings/grafana.gpg
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" \
  | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install -y grafana
sudo systemctl enable --now grafana-server

http://<pi-ip>:3000 adresini açın, admin / admin ile giriş yapın ve istendiğinde yeni bir parola belirleyin.

Grafana'yı InfluxDB'ye Bağlayın

Grafana'da Connections, Data sources, Add data source, InfluxDB yolunu izleyin, ardından:

  1. Query language değerini Flux olarak ayarlayın.
  2. URL: http://localhost:8086.
  3. InfluxDB Details altında Organization'ı home yapın, bir token yapıştırın (en az yetki için influx auth create --org home --read-buckets ile salt okunur bir token oluşturun) ve Default Bucket'ı sensors olarak ayarlayın.
  4. Save and test'e tıklayın. Bildirilen bucket sayısını görmelisiniz.

Raspberry Pi Grafana InfluxDB Paneli Oluşturun

Yeni bir panel oluşturun, bir Time series paneli ekleyin ve şu Flux sorgusunu yapıştırın:

from(bucket: "sensors")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "climate" and r._field == "temperature")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "temperature")

room bir etiket olduğu için Grafana her oda için otomatik olarak bir çizgi çizer. Pi üzerinde gerçek fark yaratan birkaç panel tercihi:

  • aggregateWindow kullanın. O olmadan 30 günlük bir aralık her ham noktayı çeker ve Pi zorlanır. Onunla Grafana yalnızca panelin gösterebileceği kadar nokta ister.
  • Panel yenileme süresini 30 saniye veya daha fazla yapın. Daha hızlı yenilemeler, yavaş değişen veriler için Pi'de çoğunlukla boşuna CPU harcar.
  • Her odadaki güncel sıcaklık için mean yerine last() kullanan bir Stat paneli ekleyin.
  • Grafana uyarılarını ölçülü kullanın. Pi üzerinde değerlendirilirler, bu yüzden değerlendirme aralığını makul tutun.

Veritabanını atlayıp canlı MQTT değerlerini doğrudan grafiğe dökmeyi tercih ederseniz, Grafana MQTT veri kaynağı rehberi bu yaklaşımı gösterir. Daha basittir ama geçmiş tutmaz.

Broker'ı Özel Kimlik Bilgilerine Taşıma

Genel test broker'ı herkes tarafından okunabilir; bu yüzden üretimdeki sensörler özel bir broker'a yayın yapmalıdır. Bir bulut MQTT broker olan ConnectMQ ile portalda bir broker oluşturur ve bir kullanıcı adı, parola ve client ID alırsınız. telegraf.conf içinde üç şeyi değiştirin:

[[inputs.mqtt_consumer]]
  servers = ["ssl://broker.connectmq.com:8883"]
  client_id = "YOUR_CLIENT_ID"
  username = "YOUR_USERNAME"
  password = "YOUR_PASSWORD"
  topics = ["home/+/climate"]
  qos = 1
  data_format = "json_v2"

ConnectMQ bir Let's Encrypt sertifikası kullanır; böylece Pi'nin sistem CA paketi onu doğrular ve tls_ca satırına gerek kalmaz. Client ID'lerin verilen kimlik bilgilerine bağlı olduğunu unutmayın: Telegraf'ın ve her sensörün kendi client ID'si olmalıdır. topic_parsing ayarını yeni topic yapınıza uyacak şekilde güncelleyin.

Böylece sorumluluklar temiz biçimde ayrılır: ConnectMQ her cihaz için bağlantı, kimlik doğrulama ve yönlendirmeyi üstlenir; Pi ise saklamak istediğiniz verilerin depolanması ve görselleştirilmesiyle ilgilenir. ConnectMQ, retained mesajlar dışında mesaj geçmişi saklamaz; bu nedenle uzun vadeli veriler için doğru yer InfluxDB'dir.

Yığını Sağlıklı Tutmak

Sorun Neden Çözüm
Telegraf günlüğünde not authorized görünüyor Yanlış kimlik bilgileri veya client ID Üçünü de portaldan yeniden kopyalayın
InfluxDB'de nokta yok, hata da yok Topic filtresi eşleşmiyor topics değerini canlı bir mosquitto_sub ile karşılaştırın
Noktalar geliyor ama alanlar eksik json_v2 yolu veya tipi yanlış Alan adlarını ve type değerini kontrol edin
Grafana panelleri uzun aralıklarda yavaş Toplama (aggregation) yok aggregateWindow ekleyin
SD kart aylar sonra bozuldu Sürekli yazma InfluxDB verilerini bir SSD'ye taşıyın
Disk doluyor Saklama süresi çok uzun influx bucket update --retention 30d

Hem InfluxDB'yi (influx backup /path/to/backup) hem de /var/lib/grafana/grafana.db dosyasını düzenli olarak yedekleyin. Bir akşamınızı ayarlamaya harcadığınız bir paneli kaybetmek, bir haftalık sıcaklık verisini kaybetmekten daha can sıkıcıdır.

ConnectMQ ile Başlayın

Sensörlerinizi ve Telegraf'ı dakikalar içinde özel bir broker'a yönlendirin: app.connectmq.com adresinden kaydolun, ücretsiz Serverless planı seçin (kredi kartı gerekmez) ve oluşturulan kimlik bilgilerini kopyalayın. Pi serisinin geneli için Raspberry Pi MQTT eğitimi ile başlayın; container tercih ediyorsanız Raspberry Pi üzerinde IOTstack rehberine göz atın.

Sık Sorulan Sorular

InfluxDB doğrudan MQTT'ye abone olabilir mi?

InfluxDB 2 OSS tek başına bunu yapamaz. Standart köprü Telegraf'ın mqtt_consumer girişidir ve aynı Pi üzerinde düşük bellek tüketimiyle sorunsuz çalışır.

Bu, 32 bit Raspberry Pi OS üzerinde çalışır mı?

InfluxDB 2 64 bit bir işletim sistemi gerektirir, bu yüzden arm64 imajını kullanın. Grafana ve Telegraf'ın 32 bit sürümleri vardır, ancak sınırlayıcı parça veritabanıdır.

Bir Raspberry Pi, InfluxDB'de ne kadar veri saklayabilir?

Bu, kaç seri olduğuna, ne sıklıkla raporladıklarına ve diskinize bağlıdır. Her on saniyede bir raporlayan birkaç sensör hafif bir yüktür; büyümenin sınırlı kalması için bir SSD ve bir saklama politikası kullanın.

Grafana, InfluxDB olmadan MQTT okuyabilir mi?

Evet, MQTT veri kaynağı eklentisiyle canlı değerleri gösterebilir, ancak geçmişi ve toplamayı kaybedersiniz. Günler veya aylar boyunca eğilimlere ihtiyaç duyduğunuzda InfluxDB kullanın.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.