Akıllı Ev Sistemi İçin Komutları Otomatik Oluşturma

Cenker Sisman
Deep Learning Türkiye
4 min readOct 7, 2019

Derin öğrenme için veri ne anlama geliyorsa, CEYD platformu için de komut o anlama gelmekte. Halen 300 binden fazla komut oluştuğu ve komutların birbirleriyle etkileşimli olduğu düşünülürse, komut oluşturmanın da otomatik hale getirilmesi önemli bir konu.

Akıllı ev sistemleri gibi bir yapıda farklı işlevler için çok sayıda komut yazıp oluşturmak kullanıcı için tercih edilmeyecek bir yaklaşımdır. Çok sayıda cihaz kontrol etmek için MQTT komutlarını tek tek yazıp devreye almak yerine, tek bir komut içine oluşacak tüm komutları yazmak hatta bunları dinamik olarak sağlamak ve sonrasında komutların CEYD tarafından oluşturulmasını sağlamak daha pratik bir yaklaşım olacaktır.

Önce tüm kurguyu özetleyelim: Oluşturulacak tüm MQTT komutları için bazı parametrelerin sabit, bazılarının ise değişken bir yapıda olduğunu biliyoruz. Sabit olanlar MQTT sunucu IP ve port numarası, kullanıcı ismi ve şifresi; değişken olanlar ise komutların topic isimleri ve cevaplarıdır.

Şimdi bu şekilde bir yaklaşımı nasıl gerçekleştirebiliriz, evdeki bir cihaza müdahale edecek bir MQTT komutunun cevabını ele alıp neleri sadeleştirebiliriz bir bakalım:

{!SET result={!RET mqttpublishauth tcp://xxx.xxx.xxx.xxx:1883,LambaTopic,ram,a,username,password!}!}
{!IF $result==connected??
{!RET cevap tepkileri!} salon lambasını yakıyorum {!GET SAHİBİNADI!}
::Bir terslik var. Yapamadım!}

İlk amacımız bu komut cevabını bir şablona dönüştürmek. Şablon komutumuzun ismi de cmdmqtttemplate olsun. Aşağıda şablonun ilk hali bulunmakta. Yazının devamında revize edeceğiz.

Komutlarımızı önceki yazılarda da belirtildiği gibi http://ceyd-a.net/komutekle sayfasından girebilir ve aynı kullanıcı ismi girişli cihazınızda bu komutları kullanabilirsiniz.

Yukarıda da görüldüğü gibi bir MQTT komut cevabının içinde sabit olarak IP PORT ikilisi, cihaz ismi, kullanıcı ismi ve şifre bulunmakta.
Sabit değerleri atayacak olan tek bir komuta ihtiyacımız olacak (1.Aşama):

cmdsetmqttparameters IPPORT, DEVICENAME, USERNAME, PASS

İşlevleri oluşturacak komutlar ise aşağıdaki gibi oluşturulacak (2.Aşama):

cmdmqtttemplate TOPIC1, İÇERİK1, KOMUT İSMİ1, KOMUT CEVABI1
cmdmqtttemplate TOPIC2, İÇERİK2, KOMUT İSMİ2, KOMUT CEVABI2

Amacımız mümkün mertebe sadeleştirme olacağı için son aşamada cmdmqtttemplate komutlarını tek bir komuta indireceğiz.

1.Aşama:

CEYD yapısında değişkenlerin içerikleri farklı komutlar içinde de kullanılabildiği için, cmdsetmqttparameters komutunda parametre üzerinden atadığımız değişkenler, cmdmqtttemplate komutlarında da kullanılabilecektir. Buradaki staMqttIPPort, staMqttDevicename, staMqttUsername ve staMqttPassword değişkenleri diğer komutlarda kullanılmak üzere oluşturulmuştur. Bu değişkenlerin değerlerini de komut parametrelerinden sağlıyoruz. Görüldüğü üzere komutun 4 adet parametresi vardır.

cmdsetmqttparameters ({BAŞ}),({BAŞ}),({BAŞ}),({HER})

Komutu kaydedip oluşturduktan sonra Komutlarımı yükle dediğimizde cihazımıza komut yüklenecektir. Mesaj yaz bölümünden

cmdsetmqttparameters IPPORT, DEVICE, USER, PASS
girdiğimizde aşağıdaki ekrana benzer bir sonuçla karşılacağız.

Parametreleri değişkenlere atayan ilk komutu oluşturduk. Şimdi ikinci aşamaya geçelim.

2. Aşama

Son aşamamızda tüm komutları oluştur isminde bir komut oluşturacağız. Cevap olarak bize istediğimiz komutları oluşturacak. cmdaddresponsewithpattern komutu önceki yazımızdan da hatırlayacağınız üzere yeni bir komut oluşturmak içindi.

cmdaddresponsewithpattern SORU, ŞABLON, CEVAP
formatında kullanıldığını düşünürsek,

{!RET cmdaddresponsewithpatterns yakar mısın,.*?,cmdmqtttemplate LambaTopic,a,yaktım,yakamadım!}

satırı bize yakar mısın isimli bir komutu oluşturacak ve cevap olarak da son parametredeki {!RET cmdmqtttemplate Lambatopic,a,yaktım,yakamadım!} komutunu çalıştıracaktır.

Önce revize edeceğimizi söylediğimiz cmdmqtttemplate şablon komutu bitirelim çünkü bu son aşamada cevabı bu şablon şeklinde olan komutlar oluşturacağız.

Şablon komutumuzun son hali aşağıdadır. Bir MQTT komutunda yapılması gereken tüm işlemleri ona sağlanan değişkenler üzerinden gerçekleştirmektedir. Komut, sta ile başlayan değişkenleri ilk aşamada oluşturduğumuz cmdaddmqttparameters komutu çalıştıktan sonra almış olacak, $1,$2,$3 ve $4 parametrelerini ise kendi üzerinden sağlayacaktır.

Tüm komutları oluştur isminde bir komut oluşturalım ve cevap kısmına oluşturmak istediğimiz komutları yazalım:

Şimdi tüm komutları oluştur diyelim.

İşte sonuç: İstediğimiz tüm komutlar aşağıdaki gibi oluşmuş olacaktır:

Bu şekilde önce cmdsetmqttparameters IPPORT, DEVICE, USER, PASS diyerek (yazarak) sabit değerleri atıyoruz. Sonrasında tüm komutları oluştur diyerek otomatik olarak istediğimiz tüm komutlar oluşuyor. camı siler misin, söndürür müsün, yakar mısın gibi komutları tek tek oluşturmak yerine tek seferde oluşturabiliyoruz.

Peki, CEYD için gelecekte bizi nasıl bir geliştirme yapısı bekliyor? İşte örnek bir video. Blok geliştirme yapısı şu anda geliştirme aşamasındadır ve çok yakında mevcut kod geliştirme yapısına alternatif bir yaklaşım olarak sunulacaktır.

Komutları oluşturmada katkıları olan ve yazıyla ilgili aşağıdaki videoyu hazırlayan Sayın Ahmet Taşdemir’e teşekkür ederim.

--

--

Cenker Sisman
Deep Learning Türkiye

Senior Software Architect in OTI Holding, Owner of CEYD-A Turkish Mobile Assistant, Istanbul Technical University Computer Engineering M.Sc.