esra.dev
@esra_s29 · Ekim 2025 tarihinde katıldı
Backend geliştirici · yazılım · sahada 8 yıl
- Konular
- 3
- Yanıtlar
- 26
- Puan
- 0
Oluşturulan forum yanıtları
Oğuz Bey doğru yerde. Bir su pompası istasyonunda birebir aynısını yaşamıştım, iki ayrı sebebi var.
1) Linux açılış mesajlarını ve login konsolunu seri porta veriyor, 115200’deki çöp o. cmdline.txt’ten console=serial0,115200 kısmını sil. Ya da raspi-config > Interface Options > Serial Port: login shell Hayır, donanım Evet. serial-getty servisinin de kapalı olduğunu kontrol et.
2) Asıl kalıcı çözüm DE/RE pini. Pi açılırken GPIO17 bir süre tanımsız kalıyor, MAX485 vericiyi açık bırakabiliyor, hatta gelen her şey sayaca gidiyor. DE/RE’den GND’ye 10k pull-down koy, pin sürülmediği sürece modül dinleme modunda kalsın.
Bir de Zero 2 W’de serial0 varsayılan olarak mini UART’a gidiyor, onun baud’u çekirdek saatine bağlı. Bluetooth’u kapatıp PL011’i al:
# config.txt
enable_uart=1
dtoverlay=disable-bt
# script
inst = minimalmodbus.Instrument("/dev/ttyAMA0", 1)
inst.serial.baudrate = 9600
inst.serial.timeout = 0.5
inst.clear_buffers_before_each_transaction = True
Sayaç kilitlendiğinde clear_buffers da işe yarıyor, yarım kalmış bir cevabı bir sonraki sorguya taşımıyor.
Çok mantıklı, uyguladım. PPK2 ile uyku 6,8 µA, uyanma döngüsü ortalama 1,4 s’de 88 mA çıktı. Cihaz artık her mesajda enerji.mAs ve pil.v gönderiyor, grafikte sum ile günlük toplamı görüyorum, günde 18 mAh civarı. 2×AA ile kabaca 4 ay ediyor, beklediğimden kısa, WiFi bağlanma süresini kısaltmaya çalışacağım. INA219’u da çekmeceye kaldırdım.
PPK2 sipariş ettim. Peki sahada, Hermetry tarafında nasıl takip edeceğim?
Düşüklük her basınçta aynı oranda mı, yoksa sadece üst uçta mı? Kalibrasyonla düzeltilebilir mi bundan anlaşılır.
Pasif taramaya geçtim, 30 sensörün hepsi 10 saniye içinde görünüyor, hiç bağlantı hatası yok. Dakikada bir tek gw mesajı gidiyor. Sensörlerden 12’si şifreli yayını destekliyor, onlara bindkey tanımladık, kalanları değiştirme listesine koyduk.
Pencereyi büyütmek gecikmeyi artırır, tersini yapmak lazım. Bir dönem drone ile uğraşırken aynı şeyi yaşadım.
Gecikmenin kaynağı ortalamanın kendisi: 20 okumalık hareketli ortalama yaklaşık 1 saniye geriden gelir, dönüş hızı arttıkça hata büyür. Büşra Hanım’ın dediği kalibrasyon eksikliği de sağ-sol farkını açıklıyor.
Çözüm jiroskopla birleştirmek. Jiroskop dönüşü anında görür ama yavaşça kayar, manyetometre yavaş ama kaymaz. Tamamlayıcı filtre ikisini birleştirir:
// dt = 0.1 s, gz = derece/s (z ekseni jiroskop)
float a = 0.98;
heading = a * (heading + gz * dt) + (1 - a) * magHeading;
// 0/360 geçişini düzelt
float fark = magHeading - heading;
if (fark > 180) heading += 360 * (1 - a);
if (fark < -180) heading -= 360 * (1 - a);
heading = fmod(heading + 360, 360);
Kartta jiroskop yoksa bir MPU6050 eklemek en ucuz yol. Önce tekneyi suda iki tam tur döndürüp hard/soft iron kalibrasyonunu yapın.
180 meselesi ayrı: açının ortalaması alınamaz. 359 ile 1’in ortalaması 180 çıkar. Haftalık grafik saatlik toplu değerleri okuyor ve varsayılan fonksiyon ortalama. Başlık grafiğinde fonksiyonu last yapın, analiz için de başlığın yanında heading_sin ve heading_cos gönderin, onların ortalaması doğru çıkar.
MAC’i cihaz adı olarak mı kullanacaksın yoksa ayrı bir alan mı? İsim olarak pek okunaklı olmaz.
Pi OS’ta netplan yok Hakan, ayarı NetworkManager’da yapmak lazım. Bizim sahadaki kutularda da aynısı vardı.
NetworkManager iki yerde rastgele MAC kullanabiliyor: tarama sırasında ve bağlantının kendisinde. İkisini de kapatın:
# /etc/NetworkManager/conf.d/99-sabit-mac.conf
[device]
wifi.scan-rand-mac-address=no
[connection]
wifi.cloned-mac-address=permanent
ethernet.cloned-mac-address=permanent
Ayrıca mevcut bağlantı profili kendi değerini taşıyorsa global ayarı ezer, onu da düzeltin:
nmcli -f 802-11-wireless.cloned-mac-address con show "saha-wifi"
sudo nmcli con modify "saha-wifi" 802-11-wireless.cloned-mac-address permanent
sudo systemctl restart NetworkManager
stable değeri de var, her ağ için sabit ama gerçek olmayan bir MAC verir. Sizin rezervasyon gerçek MAC’e yapıldığı için permanent doğru seçenek. Yeniden başlatıp ip link show wlan0 çıktısında link/ether ile permaddr aynı mı bakın.
AP konusunda İlgaz haklı ama Log’daki takeover başka bir şey söylüyor, asıl sebep son yazdığın cümle.
Hermetry’de her cihazın tek bir oturumu olur. Aynı cihazın ikinci bağlantısı gelince birincisini kapatıp devralır. 60 kutu aynı token’la bağlanınca Hermetry bunları tek bir cihaz olarak görüyor: her bağlanan bir öncekini düşürüyor, düşen tekrar bağlanıyor, sonsuz döngü. Bunu iki ağdan sürekli yapan cihaz bir süre geri tutuluyor ve “takeover fight” bildirimi o. Normalde bağlantılar dağınık olduğu için fark etmemişsiniz, elektrik gelince 60’ı aynı anda kalkınca patlamış.
Ne yapmalı:
1. Her kutuya kendi kimlik bilgisi. 200 cihazı tek tek açmak yerine Imports sayfasından CSV ile toplu içe aktarma yapılabiliyor (dosya başına 1.000 satıra kadar), önce kuru çalıştırma gösteriyor, yeni cihazların token’ları bir kere indirilebilen bir dosyada geliyor. Alternatif olarak profilde provisioning key ile cihazların ilk açılışta kendi token’ını almasını sağlayabilirsiniz. 2. Yeniden bağlanmaya rastgele gecikme ekleyin. CONNACK 3 gelirse bekle-tekrar dene, ama hepsi aynı saniyede denemesin:
uint32_t backoff = 2000 + (esp_random() % 8000); // 2-10 sn
if (!mqtt.connected()) { delay(backoff); mqtt.connect(id, token, ""); }
3. Keepalive 30-300 saniye arası. 60 iyi. 4. 200 kutu için tek ev tipi AP’ye güvenmeyin, 2-3 tane kurumsal AP’ye bölün.
Oturum ve CONNACK detayları MQTT sayfasında.
Baud değil, voltaj sorunu. -9 V ölçtüysen zaten cevap orada.
RS-232 sinyali yaklaşık ±3 ile ±15 V arası ve mantığı ters: boşta negatif, “1” negatif, “0” pozitif. Pi’nin UART’ı ise 3.3 V TTL, 0 ile 3.3 V arası ve düz mantık. Doğrudan bağlayınca hem seviye hem polarite yanlış, çıktıdaki çöp tam olarak bu. Üstelik GPIO15’e negatif ve 9 V civarı gerilim vermek pini öldürebilir. Hemen sök, Pi’nin hâlâ sağlam olması şans.
Bende iki depoda aynı iş var, iki yol kullandım:
1. MAX3232 modülü (MAX232 değil, 3232; 3.3 V ile çalışan). VCC’yi Pi’nin 3.3 V’una ver, TTL tarafı GPIO14/15, RS-232 tarafı DB9’a. 2. Daha temizi: USB-RS232 çevirici (PL2303 ya da FTDI çipli). /dev/ttyUSB0 olarak çıkıyor, GPIO ile hiç uğraşmıyorsun.
Login ekranı meselesi: Pi seri konsolu /dev/serial0 üzerinden açık. raspi-config > Interface > Serial Port’ta “login shell over serial” sorusuna Hayır, “serial port hardware” sorusuna Evet de.
Bir de TX/RX çaprazlaması: gösterge DCE mi DTE mi bilmiyoruz. Veri gelmezse 2 ile 3’ü yer değiştir.
Okuduktan sonra Hermetry’ye gönderme kısmı basit, paho ile access token’la v1/telemetry‘ye yayınlıyorsun:
import re, json, serial
import paho.mqtt.client as mqtt
c = mqtt.Client(client_id="kantar-1")
c.username_pw_set(TOKEN, "")
c.tls_set()
c.connect(BROKER_HOST, 8883, keepalive=60)
c.loop_start()
s = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
while True:
line = s.readline().decode('ascii', 'ignore')
m = re.search(r'(-?d+.d+)s*kg', line)
if m:
c.publish("v1/telemetry", json.dumps({"weight_kg": float(m.group(1))}), qos=1)
Heartbeat’i seçerken offline alarmı düşün. Profilin Inactivity timeout’u varsayılan 600 saniye, heartbeat bundan kısa olmalı yoksa sessiz ama sağlam bir cihaz için alarm açılır.
Hakan, dokümana bak, öyle bir şey yok. Hermetry’de zamanlanmış ya da e-postayla giden hazır rapor yok, açıkça yazıyor. Ama bugün çalışan yol şu, biz aynısını bir tekstil fabrikasında yaptık:
Ölçüm: 38A için SCT-013-050 (1V çıkışlı) al, ESP32’de ADC’ye 1.65V bias ile bağla, EmonLib benzeri RMS hesabını cihazda yap. Cihaz her 30 saniyede bir current_a göndersin. Gerçek kWh istiyorsan DIN raya Modbus’lı bir enerji analizörü takman gerekir. Pens + tahmini cosφ ile %10 hata payını kabul et.
Güç ve enerji: root flow’da Save telemetry’den önce bir Calculate bloğu koy, power_kw türet. Detayı türetilmiş değerler sayfasında var.
expr: round(1.732 * 400 * msg.payload.current_a * 0.85 / 1000, 2)
target: msg.payload.power_kw
Rapor: panoya bir chart kartı koy, gruplamayı gün yap, kartın ayarlarında Download data (CSV) işaretle. Ay sonunda pencereyi Bu ay yapıp Excel indiriyorsun. Otomatik istiyorsan küçük bir script history API’den agg=sum ya da sayaç gönderiyorsan increase ile günlük değerleri çekip maili kendin atarsın.
Bunal Bey’in dediğine katılıyorum, eğik girişi Mx/My ile görmek güzel ama pahalı. Çoğu atölyede tek eksenli yük hücresi + strok ölçümü (bir lineer potansiyometre ya da enkoder) ile kuvvet-yol eğrisi alınıyor, eğik giriş zaten eğrinin şeklinden belli oluyor.
Forge kısmı: dokümanlarda Forge’un kendi sayfasını bulamadım, o yüzden parça bazlı kaydı nasıl yaptığını söyleyemem, neyi kapsadığını satış tarafına sormak lazım. Bu iş için şart da değil.
Normal IoT eklentisiyle şöyle yapabilirsiniz, biz bir müşteride böyle kurduk:
Presin yanında küçük bir kontrolcü (ESP32 + HX711 ya da endüstriyel bir yük hücresi amplifikatörü) her geçmede eğriyi yerelde örnekliyor, geçme bitince tek bir kayıt gönderiyor:
{"part_no": "RY-24117", "f_peak_kn": 12.8, "stroke_mm": 18.4, "ok": 1}
part_no metin olarak son değer görünüyor, sayılar grafikte, her kayıt geçmişte duruyor ve dışa aktarılabiliyor. Profilde f_peak_kn için üst/alt sınırlı bir alarm kuralı, ok == 0 için ayrı bir kural. Günlük adet için bir pano kartında ok anahtarının toplamı yeterli. Ham eğrinin tamamını göndermeyin, kontrolcünün SD kartında tutun, gerekirse müşteri istediğinde çıkarırsınız. CSV için: Verileri dışa aktarma.
Bu cihazı geçen yıl bir müşteride okudum, üç tane tuzağı var, büyük ihtimalle üçüne birden takıldınız 🙂
1. Baud: SDM120 fabrikadan 2400 baud geliyor, 9600 değil. Menüden değiştirmediyseniz 2400 kullanın, 8N1.
2. Fonksiyon kodu: ölçümler input register’larda, holding’de değil. Yani FC04, readInputRegisters. Gerilim 30001 yani adres 0x0000, akım 0x0006, aktif güç 0x000C, toplam aktif enerji 0x0156.
3. Veri tipi: her değer iki register’lık 32 bit float, büyük sonlu (yüksek word önce).
float regsToFloat(uint16_t hi, uint16_t lo) {
uint32_t v = ((uint32_t)hi << 16) | lo;
float f; memcpy(&f, &v, 4); return f;
}
if (node.readInputRegisters(0x0000, 2) == node.ku8MBSuccess) {
float volts = regsToFloat(node.getResponseBuffer(0), node.getResponseBuffer(1));
}
Bir de istekler arasında en az 100-200 ms bekleyin, ucuz analizörler peş peşe sorguya kızıyor. Hermetry’ye gönderirken enerjiyi kümülatif kWh olarak gönderin, günlük tüketimi orada “increase” ile alırsınız.
Bulmuyor Ilgaz, bu benim de ilk projede yanıldığım yer oldu. Hermetry pozisyondan ya da BLE vericilerinden bölge hesaplamıyor, geofence poligonu da yok. Etiket ya da onu duyan ağ geçidi odaya kendisi karar verip bölgenin adını gönderiyor. Personel takibi hazır çözümü de tam olarak böyle kurgulanmış: zone anahtarı bir bölge adı ya da outside.
Senin ölçeğin için benim önerim BLE. UWB metre altı hassasiyet için, oda seviyesinde parasını çıkarmaz. Kurgu şöyle oluyor:
- Her odaya bir sabit BLE alıcı (ESP32 yeter, prize takılı). Hepsi etiketlerin RSSI’sini bir yerel sunucuya ya da bir Pi’ye yollar.
- Pi her etiket için son 10-15 saniyede en güçlü duyan odayı seçer, bir histerezis koyar (yeni oda en az 6 dB daha güçlü olmadan değiştirme), yoksa kapı önündeki sandalye iki oda arasında zıplar.
- Pi bir gateway olarak bağlanır ve her etiketi child cihaz olarak raporlar:
v1/gw/telemetry
{
"pompa-07": {"values": {"zone": "A-3-314", "zone_id": 3314, "battery": 81}},
"sandalye-12": {"values": {"zone": "A-2-208", "zone_id": 2208, "battery": 64}}
}
zone_id‘yi bilerek ekledim: zone metin, metin anahtarların grafik geçmişi olmuyor, sadece son değer görünüyor. “Pompa dün nerelerdeydi” sorusu için sayısal bir kod lazım.
Sites & Assets tarafında odaları oluştur, kind olarak Room ya da kendi türün olan ZONE iyi gider, kodlarını gateway’in gönderdiği adlarla aynı tut. Ağaç pano ve listeler için, eşleştirmeyi yine gateway yapıyor.
Hazır çözümün sayfası modeli çok iyi anlatıyor, oradan uyarlayabilirsin: Personel takibi.

