Баянистая тема умных домов

Тема в разделе "Глядите, что я сделал", создана пользователем Spark, 2 июн 2017.

  1. Spark

    Spark Нерд

    Здравствуйте! Что-то я устал от отдыха и решил что-то сделать со своей искрой. Получилась, на мой взгляд, неплохая штучка. Тема умных домов уже заезженная, а вот умных домов, управляемых голосом я что-то не видел (если вы видели, то скиньте ссылочку пожалуйста, интересно посмотреть). Поэтому я сделал простенькую системку, управляемую голосом с телефона (не шилд голосовых команд(не помню как называется) и не gprs).
    1)Из чего собрано?
    Имеем набор йодо. Из него собрано вот это https://yadi.sk/a/7uTaVzTf3JmoEu. Как можете увидеть в этом альбоме, на данной конструкции установлена пищалка, светодиод, ик-приемник, термометр, сонар и блютуз модуль.
    2)Что умеет?
    2.1)Сонар.

    Из сонара делал простенькую сигнализацию, прям вообще простенькую.
    При нажатии кнопки на ик пульте, сонар начинает мониторить расстояние, если ближе одного метра - пищим. Нажали кнопку - вырубили пищание. Но из-за простоты и ненадежности данной сигнализации (можно спокойно проползти мимо сонара) я убрал эту функцию. Но я это сделал, так что включил этот пункт :).
    2.2)Термометр.
    Тут самое интересное. По блютузу можно запрашивать текущие показания термометра. Так же, градусник :) запоминает температуру каждый час (в 13:00, 14:00 и тд) и по блютузу мы так же можем запросить сохраненные данные.
    2.3)Светодиод.
    Включается и выключается по ик пульту, а так же можно регулировать его яркость. Реле не обзавелся, да и опыта думаю еще маловато, а серво крепить к выключателю это колхозно, как мне кажется :D.
    Кстати получился отличный ночник.
    Этим всем можно управлять голосом.
    3) Голосовое управление
    3.1)Дуся

    Это голосовой ассистент, как мне кажется, лучший. Она обладает большим функционалом. Она может звонить, манипулировать сообщениями, контактами, знает всё про наигацию, влепит лайк в вк очередному баяну, если вы заняты (нет), но менять статус и оставлять записи она может, оставляет записки, гидрометцентр, в курсе всех новостей, rrs рассылки с сайтов умеет читать, приложения открывать, сайты открывать, будильниом управляет, конвертер хороший, статейки с вики умеет читать, естественно поиск в интернете, переводчик, настройками телефона управляет. Но самая главная особенность дуси в том, что ты сам можешь написать свой скрипт и улучшить ассистента, а потом еще и выложить скрипт в сеть. Если бы мне за пиар платили...
    Так вот, в дусе у меня есть скрипты, которые открывают приложения таскера (знаю что колхоз). Она реагирует на позывной и слушает команду.
    3.2)Таскер
    В таскере я написал скрипт, который открывает блютуз терминал (я мастер извращения:)), и там пишет какую-то команду, например, "Temp". В ответ приходит температура в данную секунду. Потом скрипт экспортируется в приложение и будет потом открываться дусей
    3.3)Терминал
    Ну тут объяснять думаю ничего не надо. Связь между телефоном и искрой.

    4)Демонстрация работы.


    Прошу прощения за качество, просто кроме ноутбука больше ничего не было.


    Это всё написано вот так:
    Код (Javascript):
    function sleep(ms)
    {
        var date = new Date();
        var curDate = null;
        do { curDate = new Date(); }
        while(curDate-date < ms);
        {}
        date=null;
        curDate=null;
    }
    Serial3.setup(9600);
    var bt = require('@amperka/bluetooth').connect({
    serial: Serial3,
    speed: 9600,
    kPin: 5,
    lineEnding: '\r\n'
    });
    var x, xx, vikl;
    var ik = require('@amperka/ir-receiver').connect(P4);
    var led = require('@amperka/led').connect(P8);
    var bright = 1;
    var temp = require('@amperka/thermometer').connect(A4);
    var buzzer = require('@amperka/buzzer').connect(P5);
    var sonic = require('@amperka/ultrasonic')
    .connect({trigPin: P10, echoPin: P11});

    //программы

    //вкл/выкл светодиода и регул. его яркости с ИК
    ik.on('receive', function(code, repeat) {
        if (code === ik.keys.POWER)
        {
            led.toggle();
            if(repeat)
                led.toggle();
        }
        if(code === ik.keys.MINUS)
        {
            bright=bright-0.1;
            led.brightness(bright);
        }
        if(code === ik.keys.PLUS)
        {
            bright=bright+0.1;
            led.brightness(bright);
        }

        if(code == ik.keys.RED)
        {
            if(cikl===false)
                cikl=true;
            else
                cikl=false;
        }

    });

    //просто температура + вкл/выкл светодиода по блютуз
    bt.on('data', function(data) {
        if(data == 'Temp')
        {
            bt.println(temp.read('C').toFixed(1));
        }
        if(data == 'Tgl')
        {
            led.toggle();
        }
    });

    //температура по часам
    var date=new Date();
    setInterval(function() {
        date=new Date();
    }, 1000);
    var temperature = new Array(26);
    setInterval(function() {
        switch(date.getHours()+3)
        {
        case 25:
            if(date.getMinutes()<2)
            {
                temperature.fill(temp.read('C').toFixed(1), 1, 2);
            }
            break;
        case 26:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 2, 3);
            break;
        case 3:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 3, 4);
            break;
        case 4:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 4, 5);
            break;
        case 5:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 5, 6);
            break;
        case 6:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 6, 7);
            break;
        case 7:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 7, 8);
            break;
        case 8:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 8, 9);
            break;
        case 9:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 9, 10);
            break;
        case 10:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 10, 11);
            break;
        case 11:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 11, 12);
            break;
        case 12:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 12, 13);
            break;
        case 13:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 13, 14);
            break;
        case 14:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 14, 15);
            break;
        case 15:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 15, 16);
            break;
        case 16:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 16, 17);
            break;
        case 17:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 17, 18);
            break;
        case 18:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 18, 19);
            break;
        case 19:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 19, 20);
            break;
        case 20:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 20, 21);
            break;
        case 21:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 21, 22);
            break;
        case 22:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 22, 23);
            break;
        case 23:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 23, 24);
            break;
        case 24:
            if(date.getMinutes()<2)
                temperature.fill(temp.read('C').toFixed(1), 24, 25);
            break;
        }
    },10000);
    bt.on('data', function(data) {
        switch(data)
        {
        case 'H1':
            bt.println(temperature[1]);
            break;
        case 'H2':
            bt.println(temperature[2]);
            break;
        case 'H3':
            bt.println(temperature[3]);
            break;
        case 'H4':
            bt.println(temperature[4]);
            break;
        case 'H5':
            bt.println(temperature[5]);
            break;
        case 'H6':
            bt.println(temperature[6]);
            break;
        case 'H7':
            bt.println(temperature[7]);
            break;
        case 'H8':
            bt.println(temperature[8]);
            break;
        case 'H9':
            bt.println(temperature[9]);
            break;
        case 'H10':
            bt.println(temperature[10]);
            break;
        case 'H11':
            bt.println(temperature[11]);
            break;
        case 'H12':
            bt.println(temperature[12]);
            break;
        case 'H13':
            bt.println(temperature[13]);
            break;
        case 'H14':
            bt.println(temperature[14]);
            break;
        case 'H15':
            bt.println(temperature[15]);
            break;
        case 'H16':
            bt.println(temperature[16]);
            break;
        case 'H17':
            bt.println(temperature[17]);
            break;
        case 'H18':
            bt.println(temperature[18]);
            break;
        case 'H19':
            bt.println(temperature[19]);
            break;
        case 'H20':
            bt.println(temperature[20]);
            break;
        case 'H21':
            bt.println(temperature[21]);
            break;
        case 'H22':
            bt.println(temperature[22]);
            break;
        case 'H23':
            bt.println(temperature[23]);
            break;
        case 'H24':
            bt.println(temperature[24]);
            break;
        }
    });
    .
    Профи, что можете посоветовать по оптимизации кода? Что вообще можете предложить?
    А, кстати, я еще хочу сделать управление не через блютуз, а через интернет сервер, который можно разместить на малине. Что по этому поводу тоже можете предложить?
    Спасибо!
     
    Последнее редактирование: 2 июн 2017
    sys, ИгорьК, Tomasina и ещё 1-му нравится это.
  2. ИгорьК

    ИгорьК Гуру

    Ладно. Еще раз бесполезно выскажусь и не буду услышан. (Но лайк все равно поставил).
    Умный дом не требует управления ни голосом ни СМС ни через сервер.

    Управление требует тупой дом, тупая розетка, тупой фонарь, тупая теплица...

    Ваш телевизор управляется через пульт: теперь он от этого умный?
     
    issaom нравится это.
  3. rkit

    rkit Гуру

    В этой портянке у вас изменяются только числа, которые можно получить элементарной математикой. Ну и много где еще, наверняка. Некогда всё вычитывать.
     
  4. Spark

    Spark Нерд

    Хорошо, намотаю на шестеренки.
     
  5. ИгорьК

    ИгорьК Гуру

    Но если Вы только изучаете JS - отличная работа.
    Назовите ее "осваиваем модули в куче" - цены нет для новичков. Серьезно.