Categories: Yazılım

Geeklink Homekit Entegrasyonu

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ı

Ü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

burakalakus

Share
Published by
burakalakus
Tags: akıllı ev

Recent Posts

Linux Timezone Değiştirme (RHEL / CentOS)

Linux Timezone değiştirme işlemini komut satırından kolaylıkla yapabilirsiniz. Tüm bölgeler için timezone bilgileri /usr/share/zoneinfo/ altında saklanır. /etc/localtime ise zoneinfo altındaki… Read More

5 sene ago

Avaya SAL Gateway

Avaya SAL Gateway (Secure Access Link), Avaya tarafından ürünlerine uzaktan destek vermek için kullanılan bir uzak bağlantı çözümü. Read More

5 sene ago

Fping Komutu ve Kullanımı

Ping, işletim sisteminden bağımsız en çok kullandığımız komutlardan biri. Ağ erişim problemlerinde sorunu izole etmeden tutun da bir cihazın çalışıp… Read More

5 sene ago

Manchester Kodlaması Nedir?

Haberleşme birden fazla paydaş gerektirir ve tıpkı bir orkestra gibi uyumlu olması şarttır. Nasıl müzikte bas gitar davul "kick"iyle uyumlu… Read More

5 sene ago

SSH Key ile Şifresiz ve Güvenli Sunucu Erişimi

Bilgi işlem sektöründeyseniz özellikle gün içinde bir çok farklı Linux/Unix sunucuya erişiminiz varsa şifre hatırlamak, bunları saklamak, hem zulüm hem… Read More

7 sene ago

Dizilab Sitesinden Dizi İndirmek

İstanbul trafiğini her gün düzenli çeken biri olarak, bunun acısını azaltmak için yeni yöntemler arayışında oluyorum. Son yöntemim dizi izlemek.… Read More

7 sene ago