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
volumesklasö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:
- Connections, Data sources, Add, InfluxDB.
- Sorgu dili: InfluxQL.
- URL:
http://influxdb:8086. - Database:
sensors. Varsayılan IOTstack yapılandırmasında kullanıcı adı veya parola gerekmez. - 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_USERNAMEveYOUR_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:
- Yapıyı
docker compose stopile kısa süreliğine durdurun (veya kurduysanız IOTstack'in yedekleme betiklerini kullanın). - Klasörü arşivleyin:
sudo tar czf ~/iotstack-$(date +%F).tgz -C ~ IOTstack/docker-compose.yml IOTstack/volumes. docker compose up -dile 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.



