Evimin salonundaki IR cihazları kontrol etmek için Geeklink RemoteBox 3S kullanıyorum. Bu yazımda olmayan Geeklink HomeKit uyumluluğunu nasıl sağladım onu anlatıyorum.

Bu cihazı 2014 yılında AliExpress’ten almıştım.

Geeklink Remotebox S3

AliExpress bağlantısı;

https://s.click.aliexpress.com/e/ykcLJVW

Cihaza bağlanıp kullanmanız için YKB3 isimli bir uygulama kullanılıyor.

Geeklink için YKB3 Uygulaması
Geeklink için YKB3 Uygulaması

Ürünün maalesef HomeKit uyumluluğu yok.

HomeKit olmayan cihazları homebridge kullanarak HomeKit ekosistemine dahil edebiliyoruz.

Bilgi için;

https://homebridge.io

Homebridge açık kaynak kodlu bir github projesi olarak başladı. Şimdi homebridge üzerinde kullanılabilecek yüzlerce npm plugin bulunmakta. Böylece evinizdeki bir çok cihazı Apple HomeKit uyumluymuş gibi bu ekosisteme dahil edebiliyorsunuz.

Geeklink Nasıl Haberleşiyor?

İşe YKB uygulamasını kullanırken iPhone network trafiğini dinleyerek başladım. Bunun için uygulamanın UDP üzerinden yaptığı trafiği analiz ettim.

Ağ trafiğini dinlemek hakkında deyaylı bilgi için başka bir türkçe blog paylaşıyorum;

https://aaltintop.wordpress.com/2015/01/27/ios-ag-dinleme-packet-trace/

Bunun yanında bilgisayarınızı proxy olarak tanıtarak da (Fiddle2) bu işi çözebilirsiniz; https://stackoverflow.com/questions/1598407/iphone-and-wireshark

Yukarıdaki ilk yöntem için MAC OSX kullanmanız şart fakat proxy yöntemi için Windows işletim sistemi ile ilerleyebilirsiniz.

homebridge-cmdswitch2 plugin’i kullanarak, yazdığınız bash script ile HomeKit aksesuarı oluşturabiliyorsunuz. Dolayısıyla komut satırından çalıştırabileceğim 2 fonksiyona ihtiyacım var. Bunlardan birincisi televizyona açma/kapama komutunu göndermesi için, diğeri ise televizyonun açık/kapalı olduğunu kontrol etmesi için. Açık/kapalı durumunun kontrolü için fping kullandım.

Bakmak isterseniz –> Fping Komutu ve Kullanımı

Geeklink Homekit Entegrasyonu ile IR Kod Öğrenme

#!/usr/bin/env python
import socket
import sys
import binascii
import struct

# UDP Soket Olustur
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
broadcastIp = ('255.255.255.255', 9001)
SOF = b'\xff\xee'
EOF = b'\xef\xfe'
INIT = b'\x11\x00\x00\x11'
LEARN_IR = b'\xb1\x11\x00\x00\x00\x05\x00\x00\x00\x00\x20\xe7'
LEARN_RF = b'\xb3\x10\x00\x00\x00\x05\x00\x00\x00\x00\x20\xe8'
RF_SOF = b'\xd3\x11\x00\x00\x00\x00\x00'
IR_SOF = b'\xd1\x71\x00\x00\x00\x00\x00'

try:

    # Paket Gonder
    # Agda Geeklink cihazi olup olmadigini ogrenmek icin Broadcast
    # paketi gonderiyoruz
    print >>sys.stderr, 'gonderiyor "%s"' % binascii.hexlify(INIT)
    sent = sock.sendto(SOF+INIT+EOF, broadcastIp)

    # Broadcast paketine cevaben Geeklink cihazinin IP Adresini aliyoruz.
    print >>sys.stderr, 'bekliyor..'
    data, server = sock.recvfrom(4096)
    print('Received %r from %s' % (binascii.hexlify(INIT), server))

    # Cihazda IR Kod Ogren metodunu tetikleyen paketi gonderiyoruz.
    print >>sys.stderr, 'gönderiyor "%s"' % binascii.hexlify(LEARN_IR)
    sent = sock.sendto(SOF+LEARN_IR+EOF, server)

    # Kumandanin tusuna bastigmiizda ogrenilen kodu cevap olarak aliyoruz.
    # Deneysel olarak asagidaki islemleri payload'a uyguladigimizda
    # gonderilecek pakete ulasmis oluyoruz.
    print >>sys.stderr, 'bekliyor'
    data, server = sock.recvfrom(4096)
    print('Paket alindi %r from %s' % (binascii.hexlify(data), server))
    RF_PAYLOAD=data[7:]
    #print('RF CODE01 %s' % binascii.hexlify(RF_PAYLOAD))
    RF_PAYLOAD=RF_PAYLOAD[:-2]
    #print('RF CODE02 %s' % binascii.hexlify(RF_PAYLOAD))
    RF_PAYLOAD_LAST= bytearray(RF_PAYLOAD[-1:])[0]
    RF_PAYLOAD=RF_PAYLOAD[:-1]
    #print('RF CODE03 %s' % binascii.hexlify(RF_PAYLOAD))
    print(RF_PAYLOAD_LAST)
    RF_PAYLOAD_LAST-=113
    print(RF_PAYLOAD_LAST)
    RF_PAYLOAD_FINAL = IR_SOF + bytearray(RF_PAYLOAD) + bytes(chr(RF_PAYLOAD_LAST))
    print('RF Kodu: %s' % binascii.hexlify(RF_PAYLOAD_FINAL))

except:
    print("Hop!",sys.exc_info()[1]," hatasi.")
finally:
    print >>sys.stderr, 'Soket kapatiliyor'
    sock.close()
    sys.exit(0)

Geeklink Homekit Entegrasyonu ile IR Kodu Gönderme

#!/usr/bin/env python
import socket
import sys
import binascii

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
broadcastIp = ('255.255.255.255', 9001)
SOF = b'\xff\xee'
EOF = b'\xef\xfe'
INIT = b'\x11\x00\x00\x11'

try:
    # Paket Gonder
    # Agda Geeklink cihazi olup olmadigini ogrenmek icin Broadcast
    # paketi gonderiyoruz 
    print >>sys.stderr, 'sending "%s"' % binascii.hexlify(INIT)
    sent = sock.sendto(SOF+INIT+EOF, broadcastIp)

    # Broadcast paketine cevaben Geeklink cihazinin IP Adresini aliyoruz. 
    print >>sys.stderr, 'waiting to receive'
    data, server = sock.recvfrom(4096)
    print('Received %r from %s' % (binascii.hexlify(data), server))

    # IR Kod Ogren metodunun cevabinda aldigimiz IR kodunu bu komuda parametre
    # olarak veriyoruz (python sendCode.py IR_KODU)
    print >>sys.stderr, 'gonderiyor "%s"' % sys.argv[1]
    sent = sock.sendto(SOF+binascii.unhexlify(sys.argv[1])+EOF, server)

    # IR Kodu gonderildikten sonra cevap aliyoruz.
    print >>sys.stderr, 'cevap bekliyor '
    data, server = sock.recvfrom(4096)
    print('Paket Alindi %r from %s' % (binascii.hexlify(data), server))

    F = open("/home/pi/homebridge/stat/" + sys.argv[2],"w")
    F.write(sys.argv[3])
    F.close()

finally:
    print >>sys.stderr, 'Soket kapatiliyor'
    sock.close()
    sys.exit(0)

Öğrenme betiğiyle öğrendiğiniz kodu, daha sonra gönderme betiğine parametre olarak vererek tüm uzaktan kumandaları simule edebilirsiniz. İlgili python betiğini isterseniz homebridge’de kullanın isterseniz başka bir entegrasyon dahilinde kullanın.

RF 433 için de yine buna benzer bir yöntem kullanıyorum. RF 433 üzerinden de evde bulunan perde ve bazı aydınlatma düğmelerini kontrol ediyorum. Geeklink Homekit entegrasyonuyla hem RF 433 üzerinden kablosuz haberleşebilen hem de IR ile kontrol edilebilen ev aletlerini uzaktan cep telefonumdan kolaylıkla kontrol edebiliyorum.

Fping kullanarak yazdığım bir kaç betikle beraber sadece kontrol etmeyip, sürekli olarak durumlarını da kontrol edebiliyorum.

Yukarıdaki kod çok prematüre durumda olsa da iyi bir python kütüphanesi haline getirilebilmesi için github’a ekledim.

https://github.com/burakalakus/geeklink-python