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.
Ürünün maalesef HomeKit uyumluluğu yok.
HomeKit olmayan cihazları homebridge kullanarak HomeKit ekosistemine dahil edebiliyoruz.
Bilgi için;
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.
Bir cevap yazın