hakan_dev
@keskin-h · Aralık 2025 tarihinde katıldı
Backend geliştirici · yazılım
- Konular
- 5
- Yanıtlar
- 38
- Puan
- 0
Oluşturulan forum yanıtları
Okumayı hızlı, göndermeyi seyrek yap, ikisi ayrı şeyler. Biz su tarafında böyle kuruyoruz:
- Pi her saniye okumaya devam etsin.
- Her değer için bir ölü bant: PT100’de 0.2 °C, debide %1 gibi. Değer son gönderilenden ölü banttan fazla saparsa gönder.
- Hiç değişmese bile her 5 dakikada bir heartbeat olarak gönder.
- Tepeler için anlık debiye güvenme, debimetrenin toplam (totalizer) register’ını gönder. Arada ne olursa olsun toplam kaybolmaz, Hermetry’de increase ile saatlik hacmi alırsın.
Mesaj sayısı için: bir mesajın içinde kaç kayıt olduğu önemli değil, mesaj başına sayılıyor. Değişenleri biriktirip 30 saniyede bir ts’li dizi olarak tek mesajda gönderirsen hem kotaya hem detaya iyi gelir.
1.4e-38 kelime sırası. İki 16 bitlik register’ı ters birleştiriyorsun. Debimetrenin dokümanına bak, çoğu CDAB kullanıyor:
import struct
hi, lo = rr.registers[0], rr.registers[1]
abcd = struct.unpack(">f", struct.pack(">HH", hi, lo))[0]
cdab = struct.unpack(">f", struct.pack(">HH", lo, hi))[0]
Kota hesabı burada: Mesaj kotası ve kullanım
Pille 3 yıl Wi-Fi ile olmaz. Kendi radyonla devam edeceksen kontrol odasında bir Pi, Hermetry’ye gateway olarak bağlanır, her sensör child cihaz olur. Gateway yazılımını sen yazarsın.
2400 baud’u ben de bilmiyordum, not aldım.
Sanırım Hermetry gateway için Basics Station istiyordu, ESP32’de o çalışır mı bilmiyorum.
BMP280 tuzağına ben de düşmüştüm, geçmiş olsun 🙂
bluetooth servisi çalışıyor mu? systemctl status bluetooth
i2cdetect -y 0 dene, belki diğer bus’tadır.
İkisini de yaşadım, bir kantar projesinde.
Port adı: ttyUSB numarası takılma sırasına göre veriliyor, güvenme. ls -l /dev/serial/by-id/ ile bak, orada çeviricinin seri numaralı kalıcı adı var, onu kullan. Aynı çipten iki tane varsa ve seri numaraları yoksa udev kuralıyla USB portuna göre isim verirsin, ama çoğu zaman by-id yetiyor.
readline: varsayılan olarak bekliyor. Çoğu indikatör satırı
ile bitiriyor, o yüzden hiç dönmüyor. Bir de timeout vermezsen kablo çıktığında da sonsuza kadar bekler. Benim kullandığım:
PORT = '/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A10K3XYZ-if00-port0'
ser = serial.Serial(PORT, 9600, bytesize=8, parity='N', stopbits=1, timeout=2)
buf = b''
while True:
chunk = ser.read(64)
if not chunk:
continue # 2 sn veri yok, burada log yaz
buf += chunk
while b'
' in buf:
line, buf = buf.split(b'
', 1)
w = parse_weight(line) # örn. b'ST,GS,+0012.45kg'
if w is not None:
client.publish('v1/telemetry', json.dumps({'weight_kg': w}), qos=1)
İndikatör saniyede birkaç kez basıyorsa her satırı gönderme. Hermetry’de cihaz başına varsayılan limit saniyede 10 mesaj, üstü sessizce düşüyor. Saniyede bir, ya da sadece ST (stabil) satırlarını yolla. Servis için systemd unit yaz, User= satırına kendi kullanıcını koy, Restart=always.
Elinde zaten PZEM’in kendi sayacı var, energy_wh. Onu kullan, watt’tan enerji türetmekle uğraşma. Ben aynı modülle evdeki buzdolabını ölçerken aynı şeyi yaşadım.
Chart kartında energy_wh anahtarını seç, kova olarak 1 gün (1d), aggregate olarak increase. increase sayaç tipi değerler için var: her kovanın son değerinden bir önceki kovanın son değerini çıkarıyor. Sayaç geri düşerse (PZEM’i resetlersen ya da 9999 kWh’de dönerse) o kovada sıfırdan başlamış gibi sayıyor, yani eksi değer görmezsin.
Avantajı şu: ESP32 bir süre koparsa bile sayaç PZEM’de saymaya devam ediyor, tekrar bağlandığında aradaki enerji farkı kaybolmuyor. avg × 24’te o boşluk kayıp.
Gece yarısı bölünme dediğin şey de bence şu: gün kovaları UTC’ye göre kesiliyor, gece yarısından gece yarısına UTC. Türkiye UTC+3 olduğu için senin “gün”ün sabah 03:00’te başlıyor gibi görünür. Rapora bunu bir satırla yazarsan sorun olmaz.
Akış içinde ayrıca bir türetilmiş anahtar istersen (mesela her okumadaki fark) Delta bloğu da var, ama günlük toplam için gerek yok. Burada ikisi de anlatılıyor: Türetilmiş değerler.
preTransmission ve postTransmission fonksiyonlarını tanımladınız mı? Onlar olmadan MAX485 hiç göndermez.
Bir operatör bilgisayarına uzaktan tuş yazdıran bir cihaz güvenlik açısından ciddi bir şey. Kartın komut listesinde sadece bu komut olsun, raw komut yetkisini kimseye vermeyin.
Bir su projesinde aynı kararı verdik, şöyle yaptık ve çalışıyor:
Hazır bir IO-Link master aldık, Ethernet tarafında Modbus TCP konuşanlardan. Birkaç üreticinin böyle modeli var, her portun proses verisi ve ISDU ile okunan teşhis değerleri Modbus register’larına haritalanıyor. Model seçerken tek şart: dökümanında register haritası açıkça yazıyor olsun.
Sonra iki yol var:
- Lisanslı bir ağ geçidi Modbus TCP’yi okuyorsa (hangi protokoller olduğu modele bağlı) master’ı orada tanımlıyorsunuz, her sensör Hermetry’de ayrı child cihaz olarak çıkıyor.
- Kendi kutunuzda (bizde bir Pi) pymodbus ile okuyup
v1/gw/telemetryile gönderiyorsunuz:
{"PT-101": {"values": {"p_bar": 3.42, "sensor_temp": 31.5}},
"LT-102": {"values": {"level_cm": 214, "dirty_lens": 0}}}
Hermetry her ismi ilk raporda child cihaz olarak açıyor. Ağ geçidini eklerken “This device is a gateway” işaretli olmalı, yoksa v1/gw/* konuları reddediliyor. Teşhis bitlerini 0/1 sayı olarak gönderin ki grafikte görünsün ve alarm kurulabilsin.
Dökümantasyon: Ağ geçidinin arkasındaki cihazlar
Derya Hanım çok sağ olun, iki gündür çalışıyor. İlk kaydetmede kart konum uyarısı verdi, siteyi varlık olarak ekleyip koordinatı girince kaydetti. MOSFET’i pull-down ile bağladım, Pi açılırken lambalar artık yanıp sönmüyor. Röle de denemiştim, tık sesi bekçiyi rahatsız ediyormuş 😄
İkisi de doğru, ikisini birden düzeltmen lazım.
Baud: ESP’ye bir kez 115200’den kalıcı baud değiştirme komutu gönder. SoftwareSerial 115200’de yazarken genelde sorun çıkarmıyor, okurken bozuyor, o yüzden komut gider. Birkaç deneme gerekebilir:
mySerial.begin(115200);
mySerial.println("AT+UART_DEF=9600,8,1,0,0");
delay(200);
mySerial.begin(9600);
mySerial.println("AT"); // artık temiz OK gelmeli
Güç: Uno’nun 3.3V pini 50 mA civarı veriyor, ESP-01 gönderirken birkaç yüz mA çekiyor. “WIFI DISCONNECT” ve “busy p…” tam bunun belirtisi. 5V’tan ayrı bir AMS1117-3.3 ile besle, ESP’nin dibine 100 µF + 100 nF koy. Uno TX → ESP RX hattına da gerilim bölücü (1k/2k), ESP 3.3V seviyesinde.
Hermetry kısmı: cihaz API’si HTTPS bekliyor. AT firmware’inde SSL desteği sürüme göre değişiyor ve ESP-01’in belleğinde zorlanıyor. Benim tavsiyem Uno’yu tamamen çıkarmak: ESP-01’e Arduino core ile kendi sketch’ini yükle, sensörü doğrudan ona bağla, WiFiClientSecure ile POST at.
ESP32 deep sleep’te mikroamper seviyesinde olmalı aslında, 10 mA DevKit’in üstündeki USB çipi ve LED’den geliyor olabilir. Çıplak modülle tekrar ölç.

