Skip to content

günsan elektrik – tuya destekli akıllı priz

uzaktan kontrol ve zamanlama için bir adet akıllı priz ihtiyacı oldu. bir alış veriş sitesinden kampanyadan faydalanarak günsan elektrik e ait olan prizden sipariş verdim. ürünün resmi sayfası

https://www.gunsanelectric.com/urunler/anahtar-priz/smart/wi-fi-kontrollu-akilli-priz-16a

şeklinde..

yerli ürün alalım diye düşürken içten içe üzerine günsan yazılmış fason olarak üretilmiş bir ürün alaağımı biliyordum. günsan smart life uygulamasını kendisine göre uyarlamış ama eksiklerde kalmış.. bazı yerlerde hala smartlife yazıyor 🙂

günsanın gg smart isimli uygulamasını kullanarak kısa sürede ürünü uygulamaya sorunsuz olarak ekleyebiliyorsunuz. tuya veya smart life uygulamasını kullanmak istersenizde sorun yaşamıyorsunuz.

buraya kadar sorun yok ancak sizde benim gibi uygulamalarda istediğinizi yapamıyorsanız, verilerinizi dış dünya ile paylaşmak istemiyor ve olası güvenlik açıklarının önüne geçmek istiyebilirsiniz.

bunun için kendi uygulamamızı yazabiliriz veya evinizde çalıştırdığınız bir akıllı ev asistanına ekleyebilirsiniz. ancak bunu yapabilmeniz için cihazın iletşim prokolu vb bilgileri gerekli. bu bilgiler ne yazıkkı cihaz ile doğrudan size gelmiyor.

adım adım bu bilgileri nasıl elde edeceğimize ve nasıl basit bir program yazacağımıza bakalım.

öncelikle akıllı prizinize smart life uygulamasına doğru şekilde ekleyin.

akıllı priz wifi desteğine sahip olduğu için ipsini öğrenmeliyiz. bunu ağınızda ip taraması veya modem arayüzünden rahatlıkla bulabilirsiniz. sonrasına bir port scanner ile açık olan portları bulmalıyız… bu ürün 6666, 6667, 6668 portlarını kullanıyor.

ihtiyacımız olan diğer bilgilere ulaşmanın bir kaç yöntemi var.

en temel haliyle yakadığımız pakeleri analiz ederek bu verilere ulaşabiliriz.. mitm, proy , wireshak vb ile uğraşmayı seviyersanız konuya zaten hekimsinizdir burada anlatmayacağım, siz hallederseniz. biz daha basit olan yöntemlere bakalım.

tuya geliştirici ortamı üzerinden nasıl öğreneceğimizi inceleyelim. öncelikle

https://developer.tuya.com/en

adresinden kendimize bir hesap oluşturalım. hesap oluşumunda sonra

https://platform.tuya.com/cloud

adresinden bir proje oluşturalım.. proje oluştururken aşagıdaki parametreleri kullanabilirsiniz. dikkat etmeniz gereken nokta data center seçimi olacak. ileleyen aşamalarda yapacağımız bazı işlemlerde seçtiğiniz data center önem kazanıyor.. US veya Central Europe seçmenizi öneririm..

sonrasında kullanacağınız api servislerini belirlemeniz gerekiyor. Smart Home Content Manage, [Deprecate]Device Log Query , Smart Home Basic Service, [Deprecate]Smart Home Scene Linkage servislerinin seçili olması olmasına dikkat edelim.

projeyi oluşturduktan sonra aşagıdaki gibi ekran bizi karşılayacaktır.

Device altına giriyoruz

sonrasında Link App Account a seçip Add App Account butonuna tıklıyoruz. açılan penceredki qr kodu

smart life uygulamasında tanımlama kısmında taratacağız. bu işlem başarılı olarak tamamlandıktan sonra smart life uygulamasına eklediğiniz tuya destekli cihazları platformda görmeye başlayacaksınız

Device Permission ayarlarını Controllable olarak ayarlayın.. buraya kadar yaptıklarımız sayesinde tuya developer üzerinden akıllı prizlerimizi kontrol edebilir ve izleyebilir duruma getirmiş olduk.

şimdi api explorer i açalım.

https://platform.tuya.com/cloud/explorer

platformu açtıktan sonra “query device details” sorgusu altında device list altında gördüğümüz device id bilgisini girerek

sorguyu çalıştırdığımızda aşagıdaki gibi bir sonuç elde ediyoruz. product id ve model bilgisinden ürünün bir fason olduğunu görüyoruz.

{
  "result": {
    "active_time": 1738437687,
    "bind_space_id": "223209011",
    "category": "cz",
    "create_time": 1738180007,
    "custom_name": "tv",
    "icon": "smart/icon/ay1544008322541hl9iQ/9aebc86a6392f0b9495d826cba17ba54.jpg",
    "id": "xxxxxxxxxxxxxxxxxxxx",
    "ip": "11.11.11.11",
    "is_online": true,
    "lat": "38.74",
    "local_key": "xxxxxxxxxxxxxxxxxxxx",
    "lon": "35.44",
    "model": "EU02A-中性欧规EU02A-16A计量CB2S-BK7231N 过充保护",
    "name": "Smart plug 2",
    "product_id": "newhgkiotowsaryi",
    "product_name": "Smart Plug",
    "sub": false,
    "time_zone": "+03:00",
    "update_time": 1738437697,
    "uuid": "xxxxxxxxxxxxxxxxxxxx"
  },
  "success": true,
  "t": 1738528737555,
  "tid": "xxxxxxxxxxxxxxxxxxxx"
}

elde ettiğimiz bu bilgilerle lokalden akıllı prize bağlanıp veri çekebiliriz.

Alacağımız veriler bize doğrudan bir şey ifade etmeyebilir. anlamlı hale getirmek için Query Things Data Model altından data modelini elde edelim.

elde edilen çıktı aşagıdaki şekildedir…

{
  "result": {
    "model": "{\"modelId\":\"000004yex6\",\"services\":[{\"actions\":[],\"code\":\"\",\"description\":\"\",\"events\":[],\"name\":\"默认服务\",\"properties\":[{\"abilityId\":1,\"accessMode\":\"rw\",\"code\":\"switch_1\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_power2\",\"attribute\":\"641\"},\"name\":\"开关1\",\"typeSpec\":{\"type\":\"bool\"}},{\"abilityId\":9,\"accessMode\":\"rw\",\"code\":\"countdown_1\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_time2\",\"attribute\":\"736\"},\"name\":\"开关1倒计时\",\"typeSpec\":{\"type\":\"value\",\"max\":86400,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"s\"}},{\"abilityId\":17,\"accessMode\":\"ro\",\"code\":\"add_ele\",\"description\":\"\",\"extensions\":{\"attribute\":\"704\"},\"name\":\"增加电量\",\"typeSpec\":{\"type\":\"value\",\"max\":50000,\"min\":0,\"scale\":3,\"step\":100}},{\"abilityId\":18,\"accessMode\":\"ro\",\"code\":\"cur_current\",\"description\":\"\",\"extensions\":{\"attribute\":\"704\"},\"name\":\"当前电流\",\"typeSpec\":{\"type\":\"value\",\"max\":30000,\"min\":0,\"scale\":0,\"step\":1,\"unit\":\"mA\"}},{\"abilityId\":19,\"accessMode\":\"ro\",\"code\":\"cur_power\",\"description\":\"\",\"extensions\":{\"attribute\":\"704\"},\"name\":\"当前功率\",\"typeSpec\":{\"type\":\"value\",\"max\":80000,\"min\":0,\"scale\":1,\"step\":1,\"unit\":\"W\"}},{\"abilityId\":20,\"accessMode\":\"ro\",\"code\":\"cur_voltage\",\"description\":\"\",\"extensions\":{\"attribute\":\"704\"},\"name\":\"当前电压\",\"typeSpec\":{\"type\":\"value\",\"max\":5000,\"min\":0,\"scale\":1,\"step\":1,\"unit\":\"V\"}},{\"abilityId\":21,\"accessMode\":\"ro\",\"code\":\"test_bit\",\"description\":\"\",\"extensions\":{\"attribute\":\"736\"},\"name\":\"产测结果位\",\"typeSpec\":{\"type\":\"value\",\"max\":5,\"min\":0,\"scale\":0,\"step\":1}},{\"abilityId\":22,\"accessMode\":\"ro\",\"code\":\"voltage_coe\",\"description\":\"\",\"extensions\":{\"attribute\":\"736\"},\"name\":\"电压校准系数\",\"typeSpec\":{\"type\":\"value\",\"max\":1000000,\"min\":0,\"scale\":0,\"step\":1}},{\"abilityId\":23,\"accessMode\":\"ro\",\"code\":\"electric_coe\",\"description\":\"\",\"extensions\":{\"attribute\":\"736\"},\"name\":\"电流校准系数\",\"typeSpec\":{\"type\":\"value\",\"max\":1000000,\"min\":0,\"scale\":0,\"step\":1}},{\"abilityId\":24,\"accessMode\":\"ro\",\"code\":\"power_coe\",\"description\":\"\",\"extensions\":{\"attribute\":\"736\"},\"name\":\"功率校准系数\",\"typeSpec\":{\"type\":\"value\",\"max\":1000000,\"min\":0,\"scale\":0,\"step\":1}},{\"abilityId\":25,\"accessMode\":\"ro\",\"code\":\"electricity_coe\",\"description\":\"\",\"extensions\":{\"attribute\":\"736\"},\"name\":\"电量校准系数\",\"typeSpec\":{\"type\":\"value\",\"max\":1000000,\"min\":0,\"scale\":0,\"step\":1}},{\"abilityId\":26,\"accessMode\":\"ro\",\"code\":\"fault\",\"description\":\"\",\"extensions\":{\"attribute\":\"640\"},\"name\":\"故障告警\",\"typeSpec\":{\"type\":\"bitmap\",\"label\":[\"ov_cr\",\"ov_vol\",\"ov_pwr\",\"ls_cr\",\"ls_vol\",\"ls_pow\"],\"maxlen\":6}},{\"abilityId\":38,\"accessMode\":\"rw\",\"code\":\"relay_status\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-zhuangtai\",\"attribute\":\"736\"},\"name\":\"上电状态设置\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"off\",\"on\",\"memory\"]}},{\"abilityId\":39,\"accessMode\":\"rw\",\"code\":\"overcharge_switch\",\"description\":\"\",\"extensions\":{\"attribute\":\"128\"},\"name\":\"过充保护\",\"typeSpec\":{\"type\":\"bool\"}},{\"abilityId\":40,\"accessMode\":\"rw\",\"code\":\"light_mode\",\"description\":\"\",\"extensions\":{\"iconName\":\"tcl_function_light\",\"attribute\":\"224\"},\"name\":\"指示灯状态设置\",\"typeSpec\":{\"type\":\"enum\",\"range\":[\"relay\",\"pos\",\"none\",\"on\"]}},{\"abilityId\":41,\"accessMode\":\"rw\",\"code\":\"child_lock\",\"description\":\"\",\"extensions\":{\"iconName\":\"icon-dp_power2\",\"attribute\":\"128\"},\"name\":\"童锁开关\",\"typeSpec\":{\"type\":\"bool\"}},{\"abilityId\":42,\"accessMode\":\"rw\",\"code\":\"cycle_time\",\"description\":\"涂鸦协议\",\"extensions\":{\"iconName\":\"icon-dp_time3\",\"attribute\":\"224\"},\"name\":\"循环定时\",\"typeSpec\":{\"type\":\"string\",\"maxlen\":255}},{\"abilityId\":43,\"accessMode\":\"rw\",\"code\":\"random_time\",\"description\":\"涂鸦协议\",\"extensions\":{\"iconName\":\"icon-dp_time2\",\"attribute\":\"224\"},\"name\":\"随机定时\",\"typeSpec\":{\"type\":\"string\",\"maxlen\":255}},{\"abilityId\":44,\"accessMode\":\"rw\",\"code\":\"switch_inching\",\"description\":\"涂鸦协议\",\"extensions\":{\"attribute\":\"224\"},\"name\":\"点动开关\",\"typeSpec\":{\"type\":\"string\",\"maxlen\":255}}]}]}"
  },
  "success": true,
  "t": 1738532745188,
  "tid": "0e8bf1f9e1af11ef9e609e9247cde4aa"
}

görüleceği üzere açıklamalar vb çince.. bunu python altında kullanmak için anlamlı hale getirelim.

# DPS tanımları
DPS_MAPPING = {
    '1': {
        'id': 1,
        'name': 'Güç Anahtarı',
        'code': 'switch_1',
        'type': bool,
        'access': 'rw',
        'icon': 'icon-dp_power2',
        'format': lambda x: 'Açık' if x else 'Kapalı'
    },
    '9': {
        'id': 9,
        'name': 'Geri Sayım',
        'code': 'countdown_1',
        'type': int,
        'access': 'rw',
        'icon': 'icon-dp_time2',
        'max': 86400,
        'min': 0,
        'scale': 0,
        'step': 1,
        'unit': 'saniye',
        'format': lambda x: f'{x} saniye'
    },
    '17': {
        'id': 17,
        'name': 'Toplam Enerji',
        'code': 'add_ele',
        'type': int,
        'access': 'ro',
        'max': 50000,
        'min': 0,
        'scale': 3,
        'step': 100,
        'format': lambda x: f'{x/1000:.3f} kWh'
    },
    '18': {
        'id': 18,
        'name': 'Anlık Akım',
        'code': 'cur_current',
        'type': int,
        'access': 'ro',
        'max': 30000,
        'min': 0,
        'unit': 'mA',
        'format': lambda x: f'{x/1000:.2f} A'
    },
    '19': {
        'id': 19,
        'name': 'Anlık Güç',
        'code': 'cur_power',
        'type': int,
        'access': 'ro',
        'max': 80000,
        'min': 0,
        'scale': 1,
        'unit': 'W',
        'format': lambda x: f'{x/10:.1f} W'
    },
    '20': {
        'id': 20,
        'name': 'Anlık Voltaj',
        'code': 'cur_voltage',
        'type': int,
        'access': 'ro',
        'max': 5000,
        'min': 0,
        'scale': 1,
        'unit': 'V',
        'format': lambda x: f'{x/10:.1f} V'
    },
    '21': {
        'id': 21,
        'name': 'Test Sonucu',
        'code': 'test_bit',
        'type': int,
        'access': 'ro',
        'max': 5,
        'min': 0,
        'format': lambda x: f'Test Sonucu: {x}'
    },
    '26': {
        'id': 26,
        'name': 'Hata Durumu',
        'code': 'fault',
        'type': int,
        'access': 'ro',
        'labels': ['Aşırı Akım', 'Aşırı Voltaj', 'Aşırı Güç', 'Düşük Akım', 'Düşük Voltaj', 'Düşük Güç'],
        'format': lambda x: decode_fault(x)
    },
    '38': {
        'id': 38,
        'name': 'Röle Durumu',
        'code': 'relay_status',
        'type': str,
        'access': 'rw',
        'icon': 'icon-zhuangtai',
        'range': ['off', 'on', 'memory'],
        'format': lambda x: {'off': 'Kapalı', 'on': 'Açık', 'memory': 'Hafıza'}.get(x, x)
    },
    '39': {
        'id': 39,
        'name': 'Aşırı Şarj Koruması',
        'code': 'overcharge_switch',
        'type': bool,
        'access': 'rw',
        'format': lambda x: 'Aktif' if x else 'Pasif'
    },
    '40': {
        'id': 40,
        'name': 'LED Gösterge Modu',
        'code': 'light_mode',
        'type': str,
        'access': 'rw',
        'icon': 'tcl_function_light',
        'range': ['relay', 'pos', 'none', 'on'],
        'format': lambda x: {'relay': 'Röle', 'pos': 'Pozisyon', 'none': 'Kapalı', 'on': 'Açık'}.get(x, x)
    },
    '41': {
        'id': 41,
        'name': 'Çocuk Kilidi',
        'code': 'child_lock',
        'type': bool,
        'access': 'rw',
        'icon': 'icon-dp_power2',
        'format': lambda x: 'Kilitli' if x else 'Kilitsiz'
    },
    '42': {
        'id': 42,
        'name': 'Döngü Zamanlayıcı',
        'code': 'cycle_time',
        'type': str,
        'access': 'rw',
        'icon': 'icon-dp_time3',
        'maxlen': 255,
        'format': lambda x: f'Döngü: {x}'
    },
    '43': {
        'id': 43,
        'name': 'Rastgele Zamanlayıcı',
        'code': 'random_time',
        'type': str,
        'access': 'rw',
        'icon': 'icon-dp_time2',
        'maxlen': 255,
        'format': lambda x: f'Rastgele: {x}'
    },
    '44': {
        'id': 44,
        'name': 'Anlık Anahtar',
        'code': 'switch_inching',
        'type': str,
        'access': 'rw',
        'maxlen': 255,
        'format': lambda x: f'Anlık: {x}'
    }
}

def decode_fault(fault_code):
    faults = []
    fault_map = {
        0: "Aşırı Akım",
        1: "Aşırı Voltaj", 
        2: "Aşırı Güç",
        3: "Düşük Akım",
        4: "Düşük Voltaj",
        5: "Düşük Güç"
    }
    
    for bit, fault in fault_map.items():
        if fault_code & (1 << bit):
            faults.append(fault)
    
    return ', '.join(faults) if faults else 'Normal'

şimdi tinyyuya modulunu kullanarak akıllı prizimiden veri çekecek python kodumuzu yazalım…

import tinytuya
import time

# Cihaz bilgileri
DEVICE_ID = "xx"
IP_ADDRESS = "192.168.1.143"
LOCAL_KEY = "xx"
VERSION = 3.4

# DPS tanımları
DPS_MAPPING = {
    '1': {
        'id': 1,
        'name': 'Güç Anahtarı',
        'code': 'switch_1',
        'type': bool,
        'access': 'rw',
        'icon': 'icon-dp_power2',
        'format': lambda x: 'Açık' if x else 'Kapalı'
    },
    '9': {
        'id': 9,
        'name': 'Geri Sayım',
        'code': 'countdown_1',
        'type': int,
        'access': 'rw',
        'icon': 'icon-dp_time2',
        'max': 86400,
        'min': 0,
        'scale': 0,
        'step': 1,
        'unit': 'saniye',
        'format': lambda x: f'{x} saniye'
    },
    '17': {
        'id': 17,
        'name': 'Toplam Enerji',
        'code': 'add_ele',
        'type': int,
        'access': 'ro',
        'max': 50000,
        'min': 0,
        'scale': 3,
        'step': 100,
        'format': lambda x: f'{x/1000:.3f} kWh'
    },
    '18': {
        'id': 18,
        'name': 'Anlık Akım',
        'code': 'cur_current',
        'type': int,
        'access': 'ro',
        'max': 30000,
        'min': 0,
        'unit': 'mA',
        'format': lambda x: f'{x/1000:.2f} A'
    },
    '19': {
        'id': 19,
        'name': 'Anlık Güç',
        'code': 'cur_power',
        'type': int,
        'access': 'ro',
        'max': 80000,
        'min': 0,
        'scale': 1,
        'unit': 'W',
        'format': lambda x: f'{x/10:.1f} W'
    },
    '20': {
        'id': 20,
        'name': 'Anlık Voltaj',
        'code': 'cur_voltage',
        'type': int,
        'access': 'ro',
        'max': 5000,
        'min': 0,
        'scale': 1,
        'unit': 'V',
        'format': lambda x: f'{x/10:.1f} V'
    },
    '21': {
        'id': 21,
        'name': 'Test Sonucu',
        'code': 'test_bit',
        'type': int,
        'access': 'ro',
        'max': 5,
        'min': 0,
        'format': lambda x: f'Test Sonucu: {x}'
    },
    '26': {
        'id': 26,
        'name': 'Hata Durumu',
        'code': 'fault',
        'type': int,
        'access': 'ro',
        'labels': ['Aşırı Akım', 'Aşırı Voltaj', 'Aşırı Güç', 'Düşük Akım', 'Düşük Voltaj', 'Düşük Güç'],
        'format': lambda x: decode_fault(x)
    },
    '38': {
        'id': 38,
        'name': 'Röle Durumu',
        'code': 'relay_status',
        'type': str,
        'access': 'rw',
        'icon': 'icon-zhuangtai',
        'range': ['off', 'on', 'memory'],
        'format': lambda x: {'off': 'Kapalı', 'on': 'Açık', 'memory': 'Hafıza'}.get(x, x)
    },
    '39': {
        'id': 39,
        'name': 'Aşırı Şarj Koruması',
        'code': 'overcharge_switch',
        'type': bool,
        'access': 'rw',
        'format': lambda x: 'Aktif' if x else 'Pasif'
    },
    '40': {
        'id': 40,
        'name': 'LED Gösterge Modu',
        'code': 'light_mode',
        'type': str,
        'access': 'rw',
        'icon': 'tcl_function_light',
        'range': ['relay', 'pos', 'none', 'on'],
        'format': lambda x: {'relay': 'Röle', 'pos': 'Pozisyon', 'none': 'Kapalı', 'on': 'Açık'}.get(x, x)
    },
    '41': {
        'id': 41,
        'name': 'Çocuk Kilidi',
        'code': 'child_lock',
        'type': bool,
        'access': 'rw',
        'icon': 'icon-dp_power2',
        'format': lambda x: 'Kilitli' if x else 'Kilitsiz'
    },
    '42': {
        'id': 42,
        'name': 'Döngü Zamanlayıcı',
        'code': 'cycle_time',
        'type': str,
        'access': 'rw',
        'icon': 'icon-dp_time3',
        'maxlen': 255,
        'format': lambda x: f'Döngü: {x}'
    },
    '43': {
        'id': 43,
        'name': 'Rastgele Zamanlayıcı',
        'code': 'random_time',
        'type': str,
        'access': 'rw',
        'icon': 'icon-dp_time2',
        'maxlen': 255,
        'format': lambda x: f'Rastgele: {x}'
    },
    '44': {
        'id': 44,
        'name': 'Anlık Anahtar',
        'code': 'switch_inching',
        'type': str,
        'access': 'rw',
        'maxlen': 255,
        'format': lambda x: f'Anlık: {x}'
    }
}

def decode_fault(fault_code):
    faults = []
    fault_map = {
        0: "Aşırı Akım",
        1: "Aşırı Voltaj", 
        2: "Aşırı Güç",
        3: "Düşük Akım",
        4: "Düşük Voltaj",
        5: "Düşük Güç"
    }
    
    for bit, fault in fault_map.items():
        if fault_code & (1 << bit):
            faults.append(fault)
    
    return ', '.join(faults) if faults else 'Normal'

def check_device_status(device):
    try:
        status = device.status()
        
        if status and 'dps' in status:
            dps = status['dps']
            print("\n=== Cihaz Durumu ===")
            
            for key, value in dps.items():
                if key in DPS_MAPPING:
                    mapping = DPS_MAPPING[key]
                    try:
                        if isinstance(value, mapping['type']):
                            formatted_value = mapping['format'](value)
                            print(f"{mapping['name']}: {formatted_value}")
                        else:
                            print(f"{mapping['name']}: Tip hatası")
                    except Exception as e:
                        print(f"{mapping['name']}: Formatlama hatası - {str(e)}")
            
            print("\n=== Ham Veri ===")
            print(status)
        else:
            print("Cihaz durumu alınamadı!")
            
    except Exception as e:
        print(f"Durum kontrolünde hata: {e}")
        return None

def connect_device():
    try:
        device = tinytuya.OutletDevice(
            dev_id=DEVICE_ID,
            address=IP_ADDRESS,
            local_key=LOCAL_KEY
        )
        device.set_version(VERSION)
        return device
    except Exception as e:
        print(f"Cihaz bağlantısı hatası: {e}")
        return None

def main():
    device = connect_device()
    if not device:
        print("Program sonlandırılıyor...")
        return
    
    print("Cihaza bağlanıldı...")
    check_device_status(device)

if __name__ == "__main__":
    main()

kodu çalıştırınca aşagıdaki çıktı ile karşılacağız…

Cihaza bağlanıldı...

=== Cihaz Durumu ===
Güç Anahtarı: Açık
Geri Sayım: 0 saniye
Toplam Enerji: 0.100 kWh
Anlık Akım: 1.24 A
Anlık Güç: 279.3 W
Anlık Voltaj: 233.1 V
Test Sonucu: Test Sonucu: 1
Hata Durumu: Normal
Röle Durumu: Hafıza
Aşırı Şarj Koruması: Pasif
LED Gösterge Modu: Röle
Çocuk Kilidi: Kilitsiz
Döngü Zamanlayıcı: Döngü:
Rastgele Zamanlayıcı: Rastgele:
Anlık Anahtar: Anlık:

=== Ham Veri ===
{'dps': {'1': True, '9': 0, '17': 100, '18': 1242, '19': 2793, '20': 2331, '21': 1, '22': 567, '23': 27594, '24': 14940, '25': 2780, '26': 0, '38': 'memory', '39': False, '40': 'relay', '41': False, '42': '', '43': '', '44': ''}}

şimdilik bu kadar…. ikinci bir yazı olursa veriyi loglamayı, analizi ve açıp kapama örneklerini anlatacağım…

Arduino : LM35 Sıcaklık Sensörü ile LCD li Termometre

analog veri alabileceğniz en ucuz ve kolay bulunabilen sensörlerden bir tanesi lm35 dir. lm35 ile hassas uygulamalar yapmanın doğru olmayacağını hatırlatmakta fayda var.

arduino üzerinde analog giriş farklı portları kullanabilirsiniz. bu örnekte lm35 in Vout bacağı arduino nun A0 bacağına bağlanmıştır. burada hangi pinin kullanılacağı okunan sıcaklık degerinin hesaplanmasında önemlidir.

bu örneğimiz için Sicaklik = (500.0 * Vin)/1023 formulü bizim hesaplamızda işimize yarayacaktır.

lcd olarak standart 16×2 bir lcd kullanılmaktadır. devre kullanılan potansiyemetere ve direnç srasıyla lcd parlaklık ayarını yapmak ve lcd yi korumak için kullanılmaktadır.

lm35_lcd_uno

uno r3 için kod :

int Vin;  // Arduino A0 pinin kullanilacak degisken
float Sicaklik; // Sicakik degeri float olarak belirlenir

// include the library code:
#include <LiquidCrystal.h>

// LiquidCrystal kutuphanesi ile  lcd icin kullanacagimiz pinleri set edelim.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // lcd nin satir ve sutun bilgisi
  lcd.begin(16, 2);
  // lcd nin 1. satirina ait bilgi mesaji
  lcd.print("Sicaklik: ");
}

void loop() {
  Vin = analogRead(0);    // A0 pin değerinin okunması
  Sicaklik = (500.0 * Vin)/1023; // A0 pininden okunan degerin sicaklik degerine cevrilmesi
  // set the cursor to column 3, line 1
  lcd.setCursor(3, 1);
   // Sicaklik degerini yazirma
   lcd.print("derece "); 
  lcd.print(Sicaklik); 
       
}

circuits.io platformunu test etmk için bu uygulamayı circuits.io üzerinde yapmıştım. https://circuits.io/circuits/2424060-lm35-lcd-uno-r3/ adresinden devrenin çalışır haline ulaşabilirsiniz.

nesnelerin interneti için veri kayıt alanları : thingspeak temel kullanım

nesnelerin interneti uygulamalarının artması, uygulamalardan elde edilen verilerin kaydedileceği veri kayıt merkezi uygulamaları ihtiyaçlarınıda doğurmaktadır. bu verilerin yerelde tutulması kimi zaman imkansız, kimi zamanda veriye erişim ve inceleme gereksinimlerinden dolayı bir uygun değildir. yani nesnelerin interneti kavramı büyük veri ve bulut bilişim ile iç içe geçmiş durumdadır.

bu gereksinimin farkında olan bir çok şirket kullanıcılara parasız ve paralı seçenekler sunmaya başlamıştır. bunlardan bir taneside arkasında mathworksun olduğu thingspeak. thingspeak i diğerlerinden farklı kılan yanı matlab ile entegrasyonu. matlab ile veri işlemeye ve karışık hesaplamalarla sıklıkla uğraşan birisiyseniz gerçek dünyadan elde ettiğiniz verileri saklamak için ideal bir ortam konumunda.

örnek olarak iliniz içerisinde ayırdığınız bölgelerdeki hava sıcaklık, nem, rüzgar ile hava kirliği arasında bir ilişki   konusunda bir araştırma yapıyorsanuz sahadaki internet erişimi olan sensörlerinizin verilerini bu platformda tutabilirsiniz.

https://thingspeak.com/users/sign_up adresinde çok kısa sürede kendinize bir hesap oluşturabilirsiniz.

th1

hesabınızı oluşturduktan sonra My Channels linkine girerek New Channel diyerek yeni bir channel – yani bir veri tabanı – tablo oluşturuyoruz.

th2karşımıza çıkan ekran yandaki şekilde olacaktır.

burada yer alan alanlara ait açıklamalar kısaca aşagıdaki şekildedir.

  • Channel Name: kanal için kullanılacak isim.
  • Description: kanal için açıklama.
  • Field#: kanalda kaydedilebilecek 8 adet veri alanı mevcuttur. bu veri alanı için isim. kullanabilek için yandaki kutucuk seçilerek aktif edilmelidir..
  • Metadata: kanal datasının JSON, XML, veya CSV olup olmadığı bilgisi.
  • Tags: kanalı tanımlamak için kullanılacak anahtar kelimeler.
  • Latitude: kullanılacak sensör – kanal için enlem bilgisi
  • Longitude: kullanılacak sensör – kanal için boylam bilgisi.
  • Elevation: kullanılacak sensör – kanal için yükseklik bilgisi..
  • Make Public: verileri herkese açık hale getirmek.
  • URL: kanal hakkında bilgi içeren bir web sitesi var ise.
  • Video ID: kanal hakkında bilgi içeren bir youtube veya vimeo videosu var ise..

her kanal içine 8 tane anlık veri kaydedebiliyoruz. bu bir çok uygulama için yeterli olacaktır. formu doldurarak kaydettiğimizde thingspeak bize bir kanal oluşturacaktır.

oluşturulan her kanala ait bir idye sahip olacaktır. verilere erişmek için bu id bilgisi gerekmektedir.

kanalı oluştuduktan sonra My Channels görünümü aşagıdaki şekilde olacaktır.

th3

burada bizim için önemli alanları inceleyelim.

th4

private ve public viewde kendimizin görebileceği ve herkesin görebileceği verileri görebiliyruz. burada kanal id miz ve kanala ait temel bilgilerde yer almaktadır.

Chanel Setting kanalı oluşturken kullandığmız alanları yönetebileceğimiz kısımdır.

API Keys altında ise thingspeaka veri yazma ve okuma işlemi sırasında kullanacağımız keyler yer almaktadır. bu keyler birbirinden farklı olduğu için uygulmalar sırasında buna dikkat etmek gerekmektedir.

th5

Data Import/Export altında ise kanal altında veri eklemenize ve veri almanıza yarayan tool mevcuttur.. Export ile CSV formatında alınan dosya yapısı aşagıdaki şekildedir.

created_at,entry_id,field1
2015-12-04 19:26:13 UTC,1,
2015-12-04 19:32:53 UTC,2,0.0
2015-12-04 19:33:16 UTC,3,1.9
2015-12-04 19:33:31 UTC,4,1.9
2015-12-04 19:33:45 UTC,5,6.3
2015-12-04 19:33:59 UTC,6,3.5
2015-12-04 19:34:15 UTC,7,1.8
2015-12-04 19:34:29 UTC,8,2.4
2015-12-04 19:34:43 UTC,9,1.9
2015-12-04 19:34:58 UTC,10,4.7
2015-12-04 19:35:18 UTC,11,3.2
2015-12-04 19:35:32 UTC,12,2.1
2015-12-04 19:35:46 UTC,13,6.8
2015-12-04 19:36:00 UTC,14,4.3
2015-12-04 19:36:14 UTC,15,2.6

bir sonraki yazıda raspberry üzerinde python ile veri gönderimi konusunda bir örnek yapılacaktır. uygun bir zamandada matlab kısmına değinebiliriz.

raspberry dağıtımlarının varsayılan yönetici kullanıcı adı ve şifresi

raspberry pi üzerinde kullanılabilecek dağıtım sayısı günden güne artmaktadır. https://www.raspberrypi.org/downloads/ adreside yer alan en temel dağıtımların varsayılan yönetici kullanıcı adı şifreleri aşagıdaki gibidir. neyin ne zaman lazım olacağı belli olmuyor.

dağıtım

kullanıcı adı::şire

Arch Linux ARM root::root
Bodhi Linux pi::bodhilinux
OpenELEC root::openelec
PiBang pi::raspberry
Pidora root::raspberrypi
PiMAME pi::raspberry
Raspbian wheezy pi::raspberry
Raspbmc pi::raspberry
RISC OS N/A

raspberry üzerinden python tweepy kütüphanesi kullanılarak tweet gönderilmesi

linuxte iç ve dış ip adresi değişimlerinin twitter hesabına gönderilmesi yazısında linux üzerinden nasıl twit atılabileceğin dair bir şeyler yazmıştık. aynı işlemi raspberry üzerinden yapmak isteyebiliriz. ancak o yazıda anlatılan kütüphane ruby aitti. bize python ve c fazlasıyla yetecektir. raspberry üzerine birde ruby bulaştırmaya gerek yok.

python için işimize yarayacak bir çok kütüphane var ancak tweepy tercihimiz olacak. raspianımızı python-tweepy ve bağımlı olan kütüphanleri yükleyelim.

pi@cicek /etc/apt/sources.list.d $ sudo apt-get install python-tweepy
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  python-oauth
Suggested packages:
  python-tweepy-doc
The following NEW packages will be installed:
  python-oauth python-tweepy
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 39,0 kB of archives.
After this operation, 331 kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main python-oauth all 1.0.1-3 [14,2 kB]
Get:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main python-tweepy all 1.7.1-2+deb7u1 [24,8 kB]
Fetched 39,0 kB in 1s (32,8 kB/s)   
Selecting previously unselected package python-oauth.
(Reading database ... 53951 files and directories currently installed.)
Unpacking python-oauth (from .../python-oauth_1.0.1-3_all.deb) ...
Selecting previously unselected package python-tweepy.
Unpacking python-tweepy (from .../python-tweepy_1.7.1-2+deb7u1_all.deb) ...
Setting up python-oauth (1.0.1-3) ...
Setting up python-tweepy (1.7.1-2+deb7u1) ...

kütüphanemiz şimdi raspberry üzerinde hazır ve kullanabiliriz. http://www.tweepy.org/ adresinden kütüphane hakkında detaylı bilgi alabilirsiniz.
eğer python-tweepy reponuzda yoksa pip ile kurabilirsiniz tabiki.

pi@cicek /etc/apt/sources.list.d $ sudo pip install tweepy

kurulum tamam tweepy adresinden kütüphanenin kullanıma kısaca baktıysanız basit bir örnek yapalım.. klasik olarak cpu nun sıcaklık değerini tweet olarak atalım.

twitter üzerinden https://apps.twitter.com/ gerekli ayarları önceden yapmış olmanız gerekmektedir. çünkü buradaki Consumer ve Access bilgiler gerekecek.


#!/usr/bin/env python
#gerekli kütüphaneleri import edelim
import os
import sys
import tweepy

#apps.twitter.com adresinden aldığımız consumer ve access bilgileri tanımlayalım
CONSUMER_KEY = 'size ait Consumer Key (API Key)'
CONSUMER_SECRET = 'size ait Consumer Secret (API Secret)'
ACCESS_KEY = 'size ait Access Token'
ACCESS_SECRET = 'size ait Access Token Secret'

#twitter ile doğrulama işlemleri gerçekleştirelim
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)

#meşhur sıcaklık verisini alıp işleyelim
cmd = '/opt/vc/bin/vcgencmd measure_temp'
line = os.popen(cmd).readline().strip()
temp = line.split('=')[1].split("'")[0]

#sıcaklık bilgisini tweet olarak gönderelim.
api.update_status(temp);

kodumuzu çalıştırdığımız da

tweepy1

ekran görüntüsündeki gibi başarılı şekilde twitimiz public olarak atılmış oldu.

mqtt client pahonun python kütüphanesi kullanılarak cloudmqtt servisi üzerinde bir örnek

mqtt için her geçen yeni bir client, kütüphane yayınlanmaya devam ediyor. bunlardan en kullanışlarından bir tanesi kesinlikle paho .

sitesinde an itibariye mqtt için C/C++, Java, Javascript, Python, Go ve C# .NET destekleri olduğu görülmekte.

paho nun python kütüphaneleri kullanarak basit bir örnek yapalım. öncelikle gerekli kütüphaleri raspberry üzerine yükleyelim.

pi@cicek ~ $ sudo pip install paho-mqtt

eğer sisteminiz üzerinde pip kurulu değilse tabiki öncelikle pip kurulumunu yapmanız gerekmektedir.

pi@cicek ~ $ sudo apt-get install python-pip

gerekli kurulumları yaptıktan sonra kodumuzu yazarak gerekli testleri yapabiliriz. bu örnekte lokal bir broker kullanmak yerine cloudmqtt.com üzerinde yer alan servisi kullanalım. böylelikle uygulamalarımızı diğer sistemlere entegrasyonu konusunda ufak bir atmış oluruz. cloudmqtt üzerinde bir hesap oluşturak yeni bir servis oluşturalım.

cloudmqtt

yukarıdaki gibi bize kullanıcı adı şifre v.b. verecektir. sitesinde yer alan şablona uygun olarak test kodumuzu yazalım.

mport mosquitto, os, urlparse
import paho.mqtt.client as paho

def on_connect(mosq, obj, rc):
    print("rc: " + str(rc))

def on_message(mosq, obj, msg):
    print(msg.topic + " " + str(msg.qos) + " " + str(msg.payload))

def on_publish(mosq, obj, mid):
    print("mid: " + str(mid))

def on_subscribe(mosq, obj, mid, granted_qos):
    print("Subscribed: " + str(mid) + " " + str(granted_qos))

def on_log(mosq, obj, level, string):
    print(string)

mqtt_pahoclient = paho.Client()
mqtt_pahoclient.on_message = on_message
mqtt_pahoclient.on_connect = on_connect
mqtt_pahoclient.on_publish = on_publish
mqtt_pahoclient.on_subscribe = on_subscribe

mqtt_pahoclient.on_log = on_log

url_str = os.environ.get('CLOUDMQTT_URL', 'mqtt://iskarfwb:tRi1l3nkuCCa@m20.cloudmqtt.com:11440')
#mqtt://USER:PASSWORD@host:port
url = urlparse.urlparse(url_str)

mqtt_pahoclient.username_pw_set(url.username, url.password)
mqtt_pahoclient.connect(url.hostname, url.port)

mqtt_pahoclient.subscribe("hello/world", 0)

mqtt_pahoclient.publish("hello/world", "my message")

rc = 0
while rc == 0:
    rc = mqtt_pahoclient.loop()
print("rc: " + str(rc))

dosyamızı cloudmqtt_test.py olarak kaydedelim. site üzerinden websocket kısmını açalım ve

pi@cicek ~ $ python cloudmqtt_test.py 

kodumuzu çalıştıralım. websocket arayüzünde

cloudmqtt2

yukarıdaki gibi raspberrymiz üzerinden gelen mesajlarımızı görebileceğiz.

iot protokolü mqtt ve mqtt brokeri mosquitto için başlangıç

yaptığımız iot uygulamalarını bir adım ileri taşımak ve standartlara uydurmak için cihazlar arasında kabul gören standartlardan bir tanesini kullanmakta fayda var.

bu konuda en büyük çalışmaları yapan ibm inde arkasında olduğu mqtt ve amqp, coap, lwm2m gibi bir kaç protokol daha mevcut.

konu hakkında detaylı bilgi edinilmek istenirse

OASIS Committee Categories: IoT/M2M
MQTT

siteleri incelenebilir. maalesef konu hakkında henüz çok fazla Türkçe doküman mevcut değil.

temel olarak yapılan uygulamalarda

– bilgilerin hızlı bir şekilde iletilebiliyor olması
– iletilen bilgilerin sorunsuz olarak iletiliyor olması
– iletimin güvenli bir şekilde olması
– iletimin performansının yüksek olması ve ölçeklendirilebilir olması
– basitleştirilmiş bir yönetim ve denetimin olması
– maliyetin düşük olması
– yazılım dili şartı olmaksızın geliştirilmeye açık olması

vb istenmektedir. bu istekleri karşılayacak bir veri iletim standartı geliştirilmesi zorunluluğundan dolayı mqtt ve benzeri protokoller ortaya çıkmıştır.

mqtt ile çalışmaya başlamadan önce bu kadar temel bilgi yeter.

mqtt de cihazlar doğrudan birbiri ile iletişim kurmak yerine broker olarak isimlendirilen bir sunucu ile irtibata geçer ve bu sunucu üzerinden iletim sağlarlar. bu sunucu ile iletim kuran cihazlar yaptığı işe göre publisher veya subscriber olarak isimlendirilirler. publisher veri sensörler gibi veri gönderen uç birimleri temsil ederken subscriber veri talebinde bulunan veya değer gönderen uç birimdir.

temel mantık bu şekildedir. işin mantığını pratik yaparak öğrenmeye devam edelim. mqtt standartı için yazılmış bir çok kütüphane vb mevcuttur. bunlardan kullanımı oldukça kolay olan mosquitto ile kod yazmadan bir kaç uygulama yapalım.

kullanacağımız yazılımları mosquitto adresinden edineceğiz.

ben test sırasında

gateway – sensor : raspberry pi – 192.168.2.37
broker – sunucu : ubuntu server – 192.168.126.128
istemci – kullanıcı : windows 7 – 192.168.2.23

şeklinde bir ağ kullanacağım.

gerekli yazılımları sırası ile kuralım…

fcicek@ubuntu:~$ sudo apt-get install mosquitto mosquitto-clients

ile ubuntu server için gerekli kurulu yapalım. eğer mosquitto repository niz içerisinde yok ise aşagıdaki şekilde ekleyebilirsiniz.

fcicek@ubuntu:~$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
fcicek@ubuntu:~$ sudo apt-get update

raspberry üzerinde kullandığımız raspbian da debian kökenli olduğu için ubuntuda olduğu gibi raspberry içinde gerekli adımları uygulayalım

pi@cicek ~ $ sudo apt-get install mosquitto mosquitto-clients

şimdi sıra windows için olan kuruluma geldi. şu anki en güncel sürüm olan mosquitto-1.4.2-install-win32.exe ı indirelim ve setup dosyasını çalıştıralım. kurulum sırasında aşagıdaki ekran görüntüsünde görüleceği üzere bağımlı olduğu bir kaç dosyalarıda bilgisayarımıza kurmamız gerekmektedir.

mos_install

Win32 OpenSSL v1.0.2d Light ssl uygulamasını pcmize kuralım pthreadVC2.dll dll dosyasını da mosquitto kurduğumuz dizine ekleyelim.

C:\Program Files (x86)\mosquitto>dir *.exe
 Directory of C:\Program Files (x86)\mosquitto

07.05.2015  16:25           120.832 mosquitto.exe
07.05.2015  16:24            13.824 mosquitto_passwd.exe
07.05.2015  16:24            30.208 mosquitto_pub.exe
07.05.2015  16:24            28.160 mosquitto_sub.exe
26.07.2015  01:27            62.913 Uninstall.exe
               5 File(s)        255.937 bytes
               0 Dir(s)  428.300.537.856 bytes free

gerekli kurulumları yaptıktan sonra her üç sistemimiz üzerinde mosquitto, mosquitto_pub ve mosquitto_sub olarak çalıştırılabilir üç dosyamız olacak. herşey tamam kod yazmadan mosquitto nın nasıl çalıştığını test edelim.

ubuntu üzerinden brokerimizin çalıştığından emin olalım.

fcicek@ubuntu:~$ ps aux | grep mosquitto
mosquit+   4792  0.0  0.0  14912   964 ?        Ss   03:15   0:05 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

raspberry üzerinde cicek isimli bir kanal oluşturarak “test_mesaji_raspberry” şeklinde bir mesaj gönderelim.

pi@cicek ~$ mosquitto_pub -h 192.168.126.128 -t cicek -m test_mesaji_raspberry
pi@cicek ~$ mosquitto_pub -h 192.168.126.128 -t cicek -m test_mesaji_raspberry_2
pi@cicek ~$ mosquitto_pub -h 192.168.126.128 -t cicek -m test_mesaji_raspberry_3

windows tarafından cicek kanalından gelen mesajları almak için

C:\Program Files (x86)\mosquitto>mosquitto_sub.exe -h 192.168.126.128 -t cicek
test_mesaji_raspberry
test_mesaji_raspberry_2
test_mesaji_raspberry_3

yukarıdaki komut takımını giriyoruz. artık raspberry tarafından girilen komut satırındaki mesajları windowsda görebiliyoruz…

raspberry pi : motion kullanarak video yayını – basit bir ip kamera

bir önceki yazıda ( raspberry pi üzerinde webcam kullanımı ““ anlık görüntü alınması ) usb bir webcam ile fswebcam kullanılarak görüntünün nasıl aktarılacağı konusunda bir örnek yapmıştık.

bu yazıda ise donanımsal olarak bir değişiklik yapmadan video yayının nasıl yapacağımıza değinelim. bu şekilde bir ip kamera sahibi olmuş olacağız. gerekli düzenlemeleri yaparak eviniz – iş yeriniz için bir güvenlik kamerasına, çocuğunuz için bir çocuk kamerasına dönüştürebilirsiniz.

motion-trans yayın yapmak için motion isimli yazılımı kullanacağız. video stream yayın bir çok uygulama ile benzer işlemi yapılabilir ancak raspberry kullanıcıları tarafında bu uygulama oldukça popüler ve kurulum ve konfigürasyonu benzerlerine göre oldukça kolay.

ilgili uygulamaya yükleyelim.

pi@cicek ~ $ sudo apt-get install motion
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  ffmpeg libpq5
Suggested packages:
  postgresql-client
The following NEW packages will be installed:
  ffmpeg libpq5 motion
0 upgraded, 3 newly installed, 0 to remove and 3 not upgraded.
Need to get 0 B/533 kB of archives.
After this operation, 1,461 kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
Preconfiguring packages ...
Selecting previously unselected package libpq5.
(Reading database ... 38800 files and directories currently installed.)
Unpacking libpq5 (from .../libpq5_9.1.16-0+deb7u2_armhf.deb) ...
Selecting previously unselected package motion.
Unpacking motion (from .../motion_3.2.12-3.4_armhf.deb) ...
Selecting previously unselected package ffmpeg.
Unpacking ffmpeg (from .../ffmpeg_6%3a0.8.17-1+rpi1_armhf.deb) ...
Processing triggers for man-db ...
Setting up libpq5 (9.1.16-0+deb7u2) ...
Setting up motion (3.2.12-3.4) ...
Adding group `motion' (GID 114) ...
Done.
Adding system user `motion' (UID 109) ...
Adding new user `motion' (UID 109) with group `motion' ...
Not creating home directory `/home/motion'.
Adding user `motion' to group `video' ...
Adding user motion to group video
Done.
[warn] Not starting motion daemon, disabled via /etc/default/motion ... (warning).
Setting up ffmpeg (6:0.8.17-1+rpi1) ...

ekran çıktısından görüldüğü gibi uygulama kuruldu ancak sunucu başlayamadı.

/etc/motion/motion.conf konfigürasyon dosyasında ben aşağıdaki şekilde gerekli değişiklikleri yaptım

pi@cicek ~ $ sudo nano /etc/motion/motion.conf

daemon on
setup_mode off
output_normal on
output_motion off
ffmpeg_cap_new on
ffmpeg_video_codec swf
target_dir /tmp/motion

webcam_port 8081
webcam_localhost off

control_port 8080
control_localhost off

yukarıdaki ayar ile sunucu modunu aktif ederek yayının localhost dışında alınabilmesi ve ayarlanabilmesi için gerekli konfügrasyon değişiklerini yapmış olduk. konfigürasyon dosyasının içine bakacak olursanız ilave bir dökümana ihtiyaç duymadan gerekli konfigürasyonu yapabilirisiniz.

şimdi ufak bir iki işlem daha yapamız lazım.daemon aktif olması için

pi@cicek ~ $ cat /etc/default/motion 
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes

olarak gerekli değişikliği yapalım.

pi@cicek ~ $ sudo chmod 777 /media

şimdi motion servisini yeniden başlatalım..

pi@cicek ~ $ sudo service motion restart 
[ ok ] Restarting motion...[....] Stopping motion detection daemon: motion.
[ ok ] Starting motion detection daemon: motion.done.

sorunsuz olarak servis aktif oldu. şimdi gerekli testlerimiz yapalım.

yukarıda konfigürasyon sırasında parola korumasız olarak web üzerinden konfigürasyonuda aktif etmiştik. bir web tarayıcı açarak http://raspberryip:8080 yazarak gerekli testi gerçekleştirelim ve konfigürasyon servisinin düzgün şekilde çalıştığından emin olalım.

motion_config

şimdi sıra esas amacımız olan görüntüyü alıp alamadığımızın testine geldi. vlc uygulamasını açarak http://raspberrypi-ipadresi:8081 adresini yazarak görüntümüzü bakalalım

motion_vlc_ac

motion_vlc_ekran

Back To Top