Raspberry Pi

Raspberry Pi'de IOTstack: Bulut MQTT Broker ile Node-RED, InfluxDB ve Grafana

IOTstack ile bir Raspberry Pi üzerinde Node-RED, InfluxDB ve Grafana'yı Docker'da çalıştırın, yerel Mosquitto konteynerini atlayın ve Node-RED'i bunun yerine harici bir bulut MQTT broker'a bağlayın.

Bir bulut MQTT broker'a bağlı Raspberry Pi IOTstack kurulumunda çalışan Node-RED, InfluxDB ve Grafana Docker konteynerleri
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

Bir Raspberry Pi IOTstack kurulumu; Node-RED, InfluxDB ve Grafana'yı birkaç komutla yeniden oluşturabileceğiniz, güncelleyebileceğiniz ve yedekleyebileceğiniz Docker konteynerleri olarak sunar. Bu eğitimde IOTstack'i kuracak, ihtiyacınız olan konteynerleri seçecek, Node-RED'i yerel bir Mosquitto konteyneri yerine harici bir MQTT broker'a bağlayacak, ölçümleri InfluxDB'de saklayacak ve Grafana'da grafiğe dökeceksiniz. Sonunda yeniden üretilebilir bir yapınız ve Pi üzerinde neyin olması, neyin olmaması gerektiğine dair net bir fikriniz olacak.

IOTstack Nedir ve Neden İşe Yarar?

IOTstack, Docker Compose'u bir menüyle saran bir topluluk projesidir. Bir listeden servisleri seçersiniz, mantıklı volume'lar ve portlarla bir docker-compose.yml oluşturur ve her şeyi tek bir komutla başlatırsınız. Her aracı doğrudan kurmaya kıyasla avantajları gerçektir:

  • Yalıtım. Node-RED'in Node.js sürümü Pi üzerindeki başka hiçbir şeyle çakışamaz.
  • Yeniden üretilebilirlik. Tüm yapı tek bir dosya ve bir volumes klasöründe tanımlanır. İkisini yeni bir Pi'ye kopyalayın ve kaldığınız yerden devam edin.
  • Temiz yükseltmeler. Daha yeni bir imajı çekin, konteyneri yeniden oluşturun ve sorun çıkarırsa geri alın.

Menü bir Mosquitto konteyneri de sunar ve birçok rehber bunu refleks olarak kurar. Ona ihtiyacınız olup olmadığını düşünün. Yerel bir broker yalnızca Pi'ye ulaşabilen cihazlara hizmet eder. Sensörleriniz birden fazla yerdeyse, port açmadan telefonunuzdan veriye ulaşmak istiyorsanız ya da broker güvenliğiyle kendiniz uğraşmak istemiyorsanız harici bir broker daha iyi bir seçimdir. Burada ConnectMQ bulut broker'ını kullanıyoruz ve Pi saf bir işleme ve depolama düğümüne dönüşüyor.

Servis Bu eğitimdeki konteyner Port
Node-RED Evet 1880
InfluxDB 1.8 Evet 8086
Grafana Evet 3000
Portainer CE İsteğe bağlı 9000
Mosquitto Hayır, yerine bulut broker kullanılıyor yok

IOTstack'i Raspberry Pi'ye Kurun

Tamamen güncellenmiş, 64 bit Raspberry Pi OS Lite veya Desktop ile başlayın. IOTstack yükleyicisi Docker'ı, Compose eklentisini ve ana dizininizdeki IOTstack klasörünü kurar:

sudo apt update && sudo apt full-upgrade -y
curl -fsSL https://raw.githubusercontent.com/SensorsIot/IOTstack/master/install.sh | bash

Betik, kullanıcınızın docker grubuna katılması için yeniden başlatmanızı isteyebilir. Yeniden başlattıktan sonra Docker'ın sudo olmadan çalıştığını kontrol edin:

docker version
docker compose version

Ardından menüyü başlatın:

cd ~/IOTstack
./menu.sh

Build Stack seçeneğini seçin, ardından boşluk tuşuyla nodered, influxdb ve grafana servislerini (konteynerler için bir web arayüzü isterseniz portainer-ce servisini de) işaretleyin. Node-RED'i seçtiğinizde menü ek node'lar sunar. node-red-contrib-influxdb ve node-red-dashboard (veya listelenmişse daha yeni Dashboard 2.0 paketini) işaretleyin. mosquitto seçeneğini işaretlemeden bırakın. Menüden çıkın ve yapıyı başlatın:

cd ~/IOTstack
docker compose up -d
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

Üç konteynerin de Up durumunu bildirmesi gerekir. Veriler, servis başına bir klasör olacak şekilde ~/IOTstack/volumes/ altında bulunur.

InfluxDB Veritabanını Oluşturun

IOTstack'teki influxdb servisi, InfluxQL kullanan ve kurulum sihirbazı olmayan InfluxDB 1.8'dir. Konteynerin içinden bir veritabanı ve bir saklama politikası oluşturun:

docker exec -it influxdb influx
CREATE DATABASE sensors
CREATE RETENTION POLICY "ninety_days" ON "sensors" DURATION 90d REPLICATION 1 DEFAULT
SHOW DATABASES
exit

Aynı Compose projesindeki konteynerler bir ağı paylaşır ve birbirlerine servis adıyla ulaşır. Bu yüzden Node-RED ve Grafana localhost değil, http://influxdb:8086 adresini kullanacak.

Node-RED'i Harici Bir MQTT Broker'a Bağlayın

Node-RED'i http://<pi-ip>:1880 adresinde açın. Tuvale bir mqtt in node'u sürükleyin ve sunucusunu düzenleyin:

  • Server: broker.connectmq.com
  • Port: herkese açık broker'da test için 1883
  • Protocol: MQTT V5 (veya 3.1.1)
  • Client ID: benzersiz ve boş olmayan bir değer, örneğin iotstack-nr-5d02e8
  • Topic: connectmq/demo/5d02e8/+/climate
  • Output: ayrıştırılmış bir JSON nesnesi

Herkese açık broker kimlik bilgisi gerektirmez; bu yüzden hemen test edebilirsiniz. Ücretsiz herkese açık MQTT broker'ın herkes tarafından okunabildiğini unutmayın; topic'in rastgele bir segment içermesinin nedeni budur. Node-RED'in MQTT node'larında yeniyseniz Node-RED MQTT eğitimi yapılandırma node'unu derinlemesine ele alıyor.

Node-RED Akışı: MQTT'den InfluxDB'ye

Aşağıdaki akışı Menu, Import ile içe aktarın. Her odanın iklim topic'ine abone olur, oda adını topic'ten çıkarır ve InfluxDB'ye bir nokta yazar.

[
  {
    "id": "mqttIn1",
    "type": "mqtt in",
    "name": "climate in",
    "topic": "connectmq/demo/5d02e8/+/climate",
    "qos": "1",
    "datatype": "json",
    "broker": "broker1",
    "nl": false,
    "rap": true,
    "rh": 0,
    "inputs": 0,
    "x": 140, "y": 100,
    "wires": [["toPoint1"]]
  },
  {
    "id": "toPoint1",
    "type": "function",
    "name": "to InfluxDB point",
    "func": "const room = msg.topic.split('/')[3];\nconst p = msg.payload;\nif (typeof p.t !== 'number') { return null; }\nmsg.measurement = 'climate';\nmsg.payload = [\n  { temperature: p.t, humidity: p.rh },\n  { room: room }\n];\nreturn msg;",
    "outputs": 1,
    "x": 360, "y": 100,
    "wires": [["influxOut1"]]
  },
  {
    "id": "influxOut1",
    "type": "influxdb out",
    "influxdb": "influxCfg1",
    "name": "write sensors",
    "measurement": "",
    "precision": "",
    "retentionPolicy": "",
    "x": 580, "y": 100,
    "wires": []
  },
  {
    "id": "broker1",
    "type": "mqtt-broker",
    "name": "ConnectMQ public",
    "broker": "broker.connectmq.com",
    "port": "1883",
    "clientid": "iotstack-nr-5d02e8",
    "autoConnect": true,
    "usetls": false,
    "protocolVersion": "5",
    "keepalive": "60",
    "cleansession": true
  },
  {
    "id": "influxCfg1",
    "type": "influxdb",
    "hostname": "influxdb",
    "port": "8086",
    "database": "sensors",
    "name": "IOTstack InfluxDB",
    "influxdbVersion": "1.x"
  }
]

Function node'u, önce alanlar sonra etiketler olmak üzere iki nesneden oluşan bir dizi döndürür; bu, node-red-contrib-influxdb paketinin etiketli tek bir nokta için beklediği formattır. Deploy edin, ardından bir test ölçümü yayınlayın:

mosquitto_pub -h broker.connectmq.com -p 1883 -i tester-5d02e8 -q 1 \
  -t connectmq/demo/5d02e8/office/climate -m '{"t":22.4,"rh":41}'

Ulaştığını kontrol edin:

docker exec -it influxdb influx -database sensors \
  -execute 'SELECT * FROM climate ORDER BY time DESC LIMIT 5'

Raspberry Pi IOTstack Üzerinde Grafana

Grafana'yı http://<pi-ip>:3000 adresinde açın, varsayılan admin hesabıyla oturum açın ve parolayı değiştirin. Bir veri kaynağı ekleyin:

  1. Connections, Data sources, Add, InfluxDB.
  2. Sorgu dili: InfluxQL.
  3. URL: http://influxdb:8086.
  4. Database: sensors. Varsayılan IOTstack yapılandırmasında kullanıcı adı veya parola gerekmez.
  5. Save and test.

Bir Time series paneli ve şu sorguyla bir pano oluşturun:

SELECT mean("temperature") FROM "climate"
WHERE $timeFilter
GROUP BY time($__interval), "room" fill(none)

Sorgu düzenleyicinin ALIAS alanına $tag_room girin; her oda için açıkça etiketlenmiş bir çizgi elde edersiniz. InfluxDB 2 ve Flux'ı tercih ediyorsanız IOTstack bir influxdb2 servisi de sunar; Raspberry Pi Grafana InfluxDB eğitimi Flux tarafını ayrıntılı olarak gösteriyor.

Üretim: Özel Broker Kimlik Bilgileri ve TLS

Gerçek kurulumlarda herkese açık broker'ı özel bir broker ile değiştirin. ConnectMQ gibi bir yönetilen MQTT broker üzerinde portalda bir broker oluşturur ve bir kullanıcı adı, parola ve client ID alırsınız. Node-RED'de mqtt-broker yapılandırma node'unu düzenleyin:

  • Port 8883, Use TLS seçeneğini işaretleyin ve Verify server certificate etkin bir TLS yapılandırması ekleyin. ConnectMQ bir Let's Encrypt sertifikası kullanır, bu nedenle özel bir CA dosyasına gerek yoktur.
  • Client ID: YOUR_CLIENT_ID. ConnectMQ client ID'leri verilen kimlik bilgilerine bağlar; bu yüzden tam olarak portalda gösterileni kullanın.
  • Security sekmesi: YOUR_USERNAME ve YOUR_PASSWORD.

Node-RED kimlik bilgilerini ~/IOTstack/volumes/nodered/data içindeki flows_cred.json dosyasında şifreli olarak saklar. Şifreleme anahtarının konteyner yeniden oluşturmalarında sabit kalması için aynı klasördeki settings.js dosyasında bir credentialSecret belirleyin.

Yedeklemeler ve Güncellemeler

IOTstack'in gücü, önem verdiğiniz her şeyin iki yerde bulunmasıdır: docker-compose.yml ve volumes/. Basit bir rutin:

  1. Yapıyı docker compose stop ile kısa süreliğine durdurun (veya kurduysanız IOTstack'in yedekleme betiklerini kullanın).
  2. Klasörü arşivleyin: sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes.
  3. docker compose up -d ile yeniden başlatın ve arşivi Pi'nin dışına kopyalayın.

İmajları güncellemek için:

cd ~/IOTstack
docker compose pull
docker compose up -d
docker image prune -f

Beklenmedik bir ana sürüm yükseltmesinin zarar vereceği servisler için, özellikle InfluxDB için, docker-compose.yml içinde imaj etiketlerini sabitleyin.

Sorun Giderme

Belirti Neden Çözüm
Node-RED MQTT node'u "connecting" durumunda kalıyor Yanlış port veya TLS ayarı TLS'siz 1883, TLS ile 8883
Node-RED bağlandıktan hemen sonra "disconnected" gösteriyor Yinelenen client ID Her istemcinin kendi ID'si olmalı
InfluxDB node'unda ENOTFOUND influxdb hatası Host localhost olarak ayarlanmış influxdb servis adını kullanın
Grafana'da "database not found" Veritabanı oluşturulmamış CREATE DATABASE sensors komutunu çalıştırın
Konteynerler yeniden başlatmadan sonra duruyor Yeniden başlatma politikası eksik IOTstack restart: unless-stopped ayarlar, dosyayı kontrol edin

ConnectMQ ile Başlayın

İşlemeyi IOTstack'e, bağlantıları ise yönetilen bir broker'a bırakın. app.connectmq.com adresinde ücretsiz bir hesap oluşturun, kredi kartı olmadan Serverless planını seçin ve oluşturulan kimlik bilgilerini Node-RED yapılandırma node'unuza yapıştırın. Daha fazla Pi projesi Raspberry Pi MQTT eğitiminde toplanmıştır.

Sık Sorulan Sorular

IOTstack'te Mosquitto konteynerine ihtiyacım var mı?

Yalnızca tüm cihazlar aynı yerel ağdaysa ve broker'ın Pi üzerinde olmasını istiyorsanız. Harici bir bulut broker ile Node-RED internet üzerinden abone olur ve Pi üzerinde broker güvenliğiyle uğraşmaktan kurtulursunuz.

IOTstack hangi InfluxDB sürümünü kullanıyor?

influxdb servisi InfluxQL'li InfluxDB 1.8'dir; ayrı bir influxdb2 servisi ise Flux'lı 2. sürümü sağlar. Birini seçin ve ona bağlı kalın, çünkü Node-RED ve Grafana ayarları farklıdır.

IOTstack'i 32 bit Raspberry Pi OS üzerinde çalıştırabilir miyim?

Bazı imajlar hâlâ 32 bit derlemeler yayınlıyor, ancak destek azalıyor. 64 bit bir işletim sistemi, imaj uyumluluk sorunlarının çoğunu önler.

IOTstack'i yeni bir Raspberry Pi'ye nasıl taşırım?

Yeni Pi'ye IOTstack'i kurun, durdurun, ardından docker-compose.yml dosyanızı ve volumes klasörünüzü geri yükleyip docker compose up -d komutunu çalıştırı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.