IoT Otomasyon

IoT ile Hayvan Takibi: LoRaWAN ve MQTT ile Hayvanları, Su Yalaklarını ve Ahır İklimini İzleme

IoT sensörleriyle hayvan takibi için pratik bir mimari: LoRaWAN tasmaları, su yalağı ve ahır iklimi sensörleri, düzenli bir MQTT topic ağacı ve bir sorun kayba dönüşmeden önce çiftçiye ulaşan uyarılar.

IoT hayvan takibini gösteren, GPS tasmalı sığırlar, bir su yalağı sensörü ve bir ahır ağ geçidi bulunan mera
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

IoT hayvan takibi sistemleri, çiftçilerin günde iki kez her parseli dolaşmasına gerek kalmadan hayvanları, suyu ve barınma koşullarını gözetmesini sağlar. Bu rehberde eksiksiz bir kurulum tasarlayacaksınız: sahada LoRaWAN tasmaları ve sensörleri, uplink'leri çözümleyen bir ağ sunucusu ve bu ölçümleri panolarınızın ve uyarılarınızın kullanabileceği bir topic ağacına dönüştüren bir MQTT broker. Ayrıca ücretsiz bir herkese açık broker üzerinde bugün test edebileceğiniz, çalışan bir Python köprüsü ve bir uyarı modeli de edineceksiniz.

IoT Hayvan Takibi Gerçekte Neyi Ölçer?

Sürüdeki sorunların çoğu ilk olarak birkaç basit sinyaldeki değişiklik olarak ortaya çıkar. İyi bir sistem her şeyi ölçmeye çalışmaz; aksi halde birinin ATV ile gidip bakmasını gerektirecek birkaç şeyi ölçer.

İzlenen Tipik sensör Neden önemli Raporlama aralığı
Hayvan konumu LoRaWAN GPS tasması veya kulak küpesi Kaçan hayvanlar, otlama örüntüleri, doğum yapan bir ineği bulma 15–60 dk, hareket halinde daha sık
Aktivite Tasma veya küpedeki ivmeölçer Kızgınlık tespiti, topallık, hastalık (azalan hareket) 15–60 dk'lık toplamlar
Su yalağı seviyesi Ultrasonik veya basınçlı seviye sensörü Yazın kuru bir yalak acil durumdur 10–30 dk
Şamandıralı vana / debi Besleme hattında darbeli debimetre Bozuk vanaları ve sızıntıları tespit eder 15 dk'lık toplamlar
Ahır sıcaklığı ve nemi İklim sensörü (çoğunlukla THI hesabıyla) Süt sığırı ve kanatlı barınaklarında ısı stresi 5–10 dk
Amonyak / CO2 Ahırdaki gaz sensörü Havalandırma sorunları, solunum sağlığı 5–10 dk
Çit voltajı Elektrikli çit izleyici Kısa devre yapan bir çit hayvanların kaçmasına izin verir 15 dk

Aralıklar önemlidir, çünkü bu cihazların neredeyse hepsi pille ve LoRaWAN görev döngüsü (duty cycle) sınırlarıyla çalışır. Her dakika veri gönderen bir tasma pilini hızla tüketir ve pek çok bölgede ağın taşıması gerekenden fazlasını da gönderir. Yavaş ve düzenli uplink'ler ile bir şey değiştiğinde olayla tetiklenen mesajları planlayın.

Neden Sahada LoRaWAN, Arkada MQTT?

Meralar geniştir ve zemin seviyesinde nadiren Wi-Fi veya güvenilir hücresel kapsama bulunur. LoRaWAN burada iyi bir seçimdir, çünkü bir ahır çatısındaki veya direkteki tek bir ağ geçidi geniş bir alanı kapsayabilir ve sensörler pille uzun süre çalışabilir. Bedeli bant genişliğidir: payload'lar çok küçüktür, tipik olarak bir düzine baytlık paketlenmiş ikili veridir.

LoRaWAN verileri doğrudan uygulamanıza iletmez. Zincir şöyle işler:

  1. Tasma veya yalak sensörü radyo üzerinden bir uplink gönderir.
  2. Bir veya daha fazla ağ geçidi bunu The Things Stack veya ChirpStack gibi bir LoRaWAN ağ sunucusuna iletir.
  3. Ağ sunucusu payload'u bir codec (küçük bir JavaScript fonksiyonu) ile çözümler ve bir JSON olayı yayınlar.
  4. Entegrasyonunuz bu olayı alır ve panolar, uyarılar ve depolama için kullanılabilir hale getirir.

Her iki büyük ağ sunucusu da uplink'leri MQTT üzerinden sunar, ancak topic'leri ağa özgüdür ve radyo meta verileriyle doludur. Pratik bir model, ağ sunucusuna abone olan ve temiz, çiftlik odaklı bir mesajı kendi MQTT broker'ınıza yeniden yayınlayan küçük bir köprü çalıştırmaktır. Böylece akış aşağısındaki her şey (panolar, Home Assistant, Node-RED, bir mobil uygulama) ağ sunucusunu değiştirseniz bile değişmeyen tek ve kararlı bir topic ağacıyla konuşur. The Things Network MQTT entegrasyonu ve ChirpStack MQTT rehberleri ağ sunucusu tarafını ayrıntılı olarak ele alır.

Merkezi bir mesaj merkezi kavramında yeniyseniz, devam etmeden önce bir MQTT broker'ın ne yaptığına dair kısa açıklamayı okumaya değer.

Topic Ağacını Tasarlama

Topic'leri radyoya göre değil, çiftliğe göre adlandırın. Saha, alan ve varlık sırasını izleyen bir ağaç hem kolay okunur hem de joker karakterlerle kolayca abone olunur:

farm1/pasture-north/animals/cow-0412/position
farm1/pasture-north/animals/cow-0412/activity
farm1/pasture-north/troughs/trough-03/level
farm1/barn-a/climate/env-01/telemetry
farm1/barn-a/fence/energizer-1/voltage
farm1/status/bridge

Birkaç kural bu yapıyı sürdürülebilir kılar:

  • Topic'lerde DevEUI'leri değil, kararlı ID'ler (kulak küpesi numarası, yalak numarası) kullanın. Sorun giderme için DevEUI'yi payload'da tutun.
  • Yalaklar, iklim ve çit voltajı için son ölçümü retained tutun; böylece sabah 5'te açılan bir pano güncel durumu anında gösterir.
  • Alarmları komut olarak retained tutmayın. Uyarılar olaydır; her yeniden bağlantıda tekrar oynatılan retained bir alarm kafa karışıklığı yaratır.
  • Payload'ları küçük JSON olarak tutun ve ağ sunucusundan gelen zaman damgasını kullanın, çünkü önemli olan köprünüzün işlediği zaman değil, uplink zamanıdır.

Örnek yalak mesajı:

{
  "ts": "2026-10-16T05:42:10Z",
  "level_pct": 18,
  "level_cm": 9.4,
  "battery_v": 3.52,
  "rssi": -112,
  "snr": -4.5,
  "dev_eui": "a84041000181c2f1"
}

Köprüyü Kurmak: Ağ Sunucusundan MQTT'ye

Aşağıdaki köprü ChirpStack v4 uplink olaylarına abone olur, çözümlenmiş object alanını alır, her cihazı bir çiftlik topic'ine eşler ve yeniden yayınlar. İlk test için hesap gerektirmeyen ancak herkes tarafından okunabilen broker.connectmq.com herkese açık alanına yayın yapar; bu nedenle rastgele bir önek ve yalnızca test verileri kullanın.

Kütüphaneyi kurun:

pip install "paho-mqtt>=2.0"
import json
import time
import uuid
import paho.mqtt.client as mqtt

# ChirpStack v4 (yerel veya barındırılan) - ağ sunucunuza göre ayarlayın
LNS_HOST = "chirpstack.local"
LNS_PORT = 1883
LNS_TOPIC = "application/+/device/+/event/up"

# Hedef broker - önce herkese açık test alanı, sonra kimlik bilgileri
DEST_HOST = "broker.connectmq.com"
DEST_PORT = 1883
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/farm1"

# DevEUI -> (alan, tür, varlık id)
DEVICES = {
    "a84041000181c2f1": ("pasture-north", "troughs", "trough-03"),
    "70b3d57ed005a1b2": ("pasture-north", "animals", "cow-0412"),
    "a84041000181d004": ("barn-a", "climate", "env-01"),
}

dest = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                   client_id=f"farm-bridge-{uuid.uuid4().hex[:6]}")
dest.will_set(f"{PREFIX}/status/bridge", "offline", qos=1, retain=True)
dest.connect(DEST_HOST, DEST_PORT, keepalive=60)
dest.loop_start()
dest.publish(f"{PREFIX}/status/bridge", "online", qos=1, retain=True)


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected to network server:", reason_code)
    client.subscribe(LNS_TOPIC, qos=1)


def on_message(client, userdata, msg):
    try:
        event = json.loads(msg.payload)
    except json.JSONDecodeError:
        return
    dev_eui = event.get("deviceInfo", {}).get("devEui", "").lower()
    if dev_eui not in DEVICES:
        print("Unknown device", dev_eui)
        return
    area, kind, asset = DEVICES[dev_eui]
    decoded = event.get("object") or {}
    rx = (event.get("rxInfo") or [{}])[0]

    out = dict(decoded)
    out["ts"] = event.get("time")
    out["dev_eui"] = dev_eui
    out["rssi"] = rx.get("rssi")
    out["snr"] = rx.get("snr")

    leaf = {"troughs": "level", "animals": "position",
            "climate": "telemetry"}.get(kind, "telemetry")
    topic = f"{PREFIX}/{area}/{kind}/{asset}/{leaf}"
    retain = kind != "animals"
    dest.publish(topic, json.dumps(out), qos=1, retain=retain)
    print("->", topic, out)


lns = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                  client_id=f"farm-lns-{uuid.uuid4().hex[:6]}")
lns.on_connect = on_connect
lns.on_message = on_message
lns.connect(LNS_HOST, LNS_PORT, keepalive=60)

print("Publishing under", PREFIX)
try:
    lns.loop_forever()
except KeyboardInterrupt:
    dest.publish(f"{PREFIX}/status/bridge", "offline", qos=1, retain=True)
    time.sleep(0.5)

Sonucu herhangi bir makineden izleyin:

mosquitto_sub -h broker.connectmq.com -p 1883 -i farm-viewer-7731 -t "connectmq/demo/<your-id>/farm1/#" -v

Herkese açık test broker'ı 8 topic seviyesine izin verir; dolayısıyla tam 8 seviyeli connectmq/demo/<id>/farm1/pasture-north/troughs/trough-03/level maksimumdur. Daha derin ağaçlar için testler sırasında farm1 seviyesini kaldırın. Herkese açık MQTT test broker'ı makalesi diğer sınırları listeler.

Çiftçilerin Gerçekten Harekete Geçtiği Uyarılar

Panolar faydalıdır, ancak bir çiftlikte asıl değer uyarılardadır. Kısa bir listeyle başlayın ve insanların bildirimleri görmezden gelmeyi öğrenmemesi için onu ince ayarlayın.

  1. Art arda iki ölçümde yalak seviyesinin yüzde 25'in altında olması (tek bir ölçüm, su içen bir hayvan olabilir).
  2. Bir yalak veya çit sensöründen 3 aralık boyunca uplink gelmemesi; bu genellikle biten bir pil veya hasarlı bir sensör anlamına gelir.
  3. İki ölçüm boyunca çit voltajının eşiğinizin altında olması (birçok çiftçi birkaç kilovolt kullanır).
  4. Konum mesajları üzerinden değerlendirilen coğrafi sınırın dışındaki hayvan.
  5. Süt sığırı veya kanatlı barınakları için ahır sıcaklık-nem indeksinin ısı stresi sınırınızın üzerinde olması.
  6. Hayvanın kendi yakın dönem ortalamasına göre aktivite düşüşü; acil durum olarak değil, kontrol için işaretlenir.

Yalak seviyesi veya ahır sıcaklığı gibi sayısal eşikler için ConnectMQ portalı eşik uyarı kuralları ve bir uyarı günlüğü içerir; böylece kod yazmadan bir topic üzerinde "level_pct 25'in altında" kuralı tanımlayabilirsiniz. Coğrafi sınırlar ve "3 aralık boyunca veri yok" kontrolleri biraz mantık gerektirir; bunları Node-RED'de veya sıradan bir MQTT client'ı olarak bağlanan küçük bir Python abonesinde çalıştırabilirsiniz:

def inside_fence(lat, lon, fence):
    # fence = (min_lat, min_lon, max_lat, max_lon) - basit sınırlayıcı kutu
    return fence[0] <= lat <= fence[2] and fence[1] <= lon <= fence[3]

Sınırlayıcı kutu kaba ama sağlamdır; düzensiz parseller için çokgen sınırlar daha iyidir ve Shapely gibi bir kütüphane bunu kolaylaştırır.

Sahadaki Tuzaklar ve Bunlardan Kaçınma Yolları

  • GPS doğruluğu ve pil. Her uplink'te konum belirleyen tasmalar pili hızla tüketir. Dinlenirken daha seyrek, ivmeölçer hareket algıladığında daha sık veri gönderen cihazları tercih edin.
  • Ağ geçidi yerleşimi. Yükseklik her şeyden önemlidir. Ahır mahyasında uygun bir dış ortam antenine sahip bir ağ geçidi, genellikle bina içindekinden çok daha geniş bir alanı kapsar.
  • Codec kayması. Bir üretici firmware'i değiştirirse çözümlenen alan adları değişebilir. Köprünün eşlemesini tek bir yerde tutun ve bilinmeyen alanları günlüğe kaydedin.
  • Saate güven. Ağ sunucusunun zaman damgasını kullanın. Aksi halde yeniden başlayan köprüler geçmişinizde boşluklar veya tekrarlar oluşturabilir.
  • Depolama. Broker bir geçmiş kaydedici (historian) değil, gerçek zamanlı bir merkezdir. Otlatma analizi için sezon boyu geçmişe ihtiyacınız varsa ölçümleri Telegraf veya Node-RED ile bir veritabanına gönderin.
  • Çiftlik verilerini herkese açık yayınlamayın. Hayvan konumları, değerli hayvanların nerede olduğunu ortaya koyar. Herkese açık broker yalnızca test içindir.

Testten Çiftlik Kurulumuna Geçiş

Köprü çalıştığında hedefi kimlik bilgileri ve TLS içeren özel bir broker'a geçirin. Tam yönetilen bir MQTT hizmetiyle broker'ı kendiniz çalıştırmak veya yamalamak zorunda kalmazsınız; sistemden sorumlu kişi aynı zamanda doğumlardan da sorumluysa bu önemlidir. ConnectMQ'da portaldan bir broker oluşturun, üretilen kullanıcı adını, parolayı ve client ID'yi kopyalayın ve hedef bağlantıyı değiştirin:

DEST_HOST = "broker.connectmq.com"   # veya portalınızda gösterilen sunucu
DEST_PORT = 8883
dest = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
dest.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
dest.tls_set()  # sistem CA paketi Let's Encrypt sertifikasını doğrular

Ücretsiz Serverless planı 25 bağlantıya kadar destekler; bu da bir köprüyü, bir panoyu, bir Node-RED örneğini ve birkaç telefonu rahatça karşılar. Çok sayıda sahası olan daha büyük işletmeler, daha fazla bağlantı ve yük dengeli tüketiciler için shared subscription sunan ücretli bir plana geçebilir. Sulama ve seralar dahil çiftlik otomasyonunun daha geniş resmi için akıllı tarım IoT rehberine ve IoT otomasyon rehberine bakın.

Çiftlik Sensörlerinizi ConnectMQ'ya Bağlayın

ConnectMQ, LoRaWAN köprünüzün, panolarınızın ve uyarı araçlarınızın buluşacağı tek ve güvenli bir yer sunar; TLS, üretilen kimlik bilgileri ve eşik uyarıları portala yerleşiktir. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve köprünüzü birkaç dakika içinde ona yönlendirin.

Sık Sorulan Sorular

IoT hayvan takibi için LoRaWAN gerekli mi?

Her zaman değil. Wi-Fi bulunan ahırlarda doğrudan MQTT yayınlayan Wi-Fi veya Ethernet sensörleri kullanılabilir; ancak açık meralarda mesafe ve pil ömrü nedeniyle LoRaWAN veya hücresel IoT genellikle tek pratik seçenektir.

GPS tasmaları doğrudan MQTT yayınlayabilir mi?

LoRaWAN tasmalarının çoğu bunu yapamaz; uplink'leri bir ağ sunucusuna gönderirler, ağ sunucusu da MQTT yayınlar. Hücresel tasmalar bazen doğrudan MQTT veya HTTP yayınlar; her iki durumda da bir köprü verileri topic ağacınıza uygun biçime getirebilir.

Yalak sensörleri ne sıklıkla veri göndermeli?

Her 10 ile 30 dakikada bir, pil ömrü ile erken uyarı arasında yaygın bir dengedir. Hayvanlar su içerken yanlış alarmları önlemek için bunu art arda iki düşük ölçümde tetiklenen bir uyarıyla birleştirin.

Herkese açık test broker'ı gerçek çiftlik verileri için güvenli mi?

Hayır. broker.connectmq.com'un herkese açık alanı herkes tarafından okunabilir ve test amaçlıdır. Üretim verileri, özellikle de hayvan konumları için kimlik bilgileri ve TLS içeren özel bir broker kullanın.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

7 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.