Main

Программирование

Тонкая настройка системы требует некоторых навыков программирования. Да, к сожалению, без этого обойтись будет очень сложно. В качестве основного языка для программирования сценариев используется язык программирования PHP. На этом языке пишутся сцерании реакции системы на различные события, а так же с помощью этого языка можно писать собственные модули и расширения.

Кроме основных конструкций языка, в системе сущестует библиотека собственных функций, которые может быть более удобно использовать для автоматизации каких-то процессов. Более подробно о них можно почитать в справочнике основных функций.

В дополнение к встроенным в систему функциям, можно создавать свои, "пользовательские" функции на языке PHP в папке www/lib с произвольным именем и c расширением php. При загрузке они автоматом прилинкуются, и будут доступны из скриптов и другого PHP кода. Вызов стандартный: MyUserFunction("Корова", 8);

Программирование системы быстрее всего изучить на примерах реального использования, приведённых в разделе сценарии.

Визуальное программирование

Для удобства в систему интегрирована возможность визуального программирования на основе проекта Google Blockly. Подробнее о данной возможности можно почитать в соответствующей ветке форума

Смотрите так же:

 
 

Обсуждение

 

sochkasov: sergejey, доброго времени суток. В настоящий момент пытаюсь разобраться с контроллером-исполнителем. Код, который представлен у Вас (http://smartliving.ru/Main/ArduinoCode2, http://smartliving.ru/Main/ArduinoCode3), у меня не компилируется ни как. Решил переписать его используя некоторые библиотеки (для упрощения понимания). Перерыл вроде весь сайт не нашел ответа на вопрос, какой формат команд используется для управления исполнительными устройствами. Я бы хотел получить полностью совместимое с Вашим кодом устройство, по этому прошу описать этот формат. Какие параметры могут передаваться туда и нужно ли в ответ что-то отвечать. Судя по коду есть несколько команд: {"HELP", commandsHelp,}, // выдать список комманд {"LED", commandsLed, }, // Установить яркость свечения светодиода на заранее заданном аналоговом порту {"ON", commandsOn, }, // включить устройство на цифровом порту X {"OFF", commandsOff, }, // выключить устройство на цифровом порту X {"STATE", commandsState, }, // получить состояние порта (уровень на порту X) {"CLICK", commandsClick, }, // кратковременно (1сек) подать высокий уровень на цифровой порт X {"LCLICK", commandsLClick, } // кратковременно (3сек) подать высокий уровень на цифровой порт X Они соответственно вызывают какие либо процедуры. Например, хочу включить лампочку, которая включается подачей высокого уровня на D3 На контроллер мы должны что отправить? http://username:password@X.X.X.X/?3=ON Так? Какой метод используется для запроса данных GET или POST? И еще, я правильно понимаю, что сделанный Вами код может использоваться в контроллере при подключенном контроллере через USB или через Ethernet? Заранее спасибо.

sergejey: Контроллер, который я использую для управления, запрограммирован достаточно просто. Он принимает по http команды в виде GET-запроса, например такого: http://192.168.0.73/?CLICK,2 Вот полный код скрипта, который "кликает" по реле: $url='http://192.168.0.73/?CLICK,2'; getURL($url,0); Я здесь ответ от контроллера даже не обрабатываю, но вообще контроллер должен отвечать просто OK. Вместо CLICK может быть другая команда (ON, OFF).

sochkasov: Сергей, спасибо за ответ. Я переписал Ваш код ArduinoCode3 так, что он теперь работает на IDE Arduino 1.0.1. В ближайшее время выложу в открытый доступ, может кому пригодится. У меня правда получились вызовы немного по другому. Но думаю это не критично, т.к. все равно их руками прописывать в настройках системы. Теперь, я хочу расширить код, который у меня получился. На данный момент он умеет: {"ON", commandsOn, }, // Устанавливает "1" на заданном цифровом порту (вызов http://xx.xx.xx.xx/?8=ON ) {"OFF", commandsOff, }, // Устанавливает "0" на заданном цифровом порту (вызов http://xx.xx.xx.xx/?8=OFF ) {"STATE", commandsState, }, // Получить состояние всех цифровых портов (вызов http://xx.xx.xx.xx/?8=STATE ) (Пример вывода P3=0;P4=0;P5=0;P6=0;P7=0;P8=1;P9=1;) {"STATUS", commandsStatus, }, // Получить состояние цифрового порта (1 или 0) (вызов http://xx.xx.xx.xx/?8=STATUS ) {"CLICK", commandsClick, }, // Кратковременная "1" на порту 1сек (время настраивается) (вызов http://xx.xx.xx.xx/?8=CLICK ) {"LCLICK", commandsLClick, }, // Кратковременная "1" на порту 3сек (время настраивается) (вызов http://xx.xx.xx.xx/?8=LCLICK ) Для чего Вы используете {"LED", commandsLed, }, оно нужно реально где-то? Еще, просматривая код ArduinoCode2 я увидел тут: void commandsLed(void) { printLine("LED command received."); sendHTTPRequest("/objects/?object=ThisComputer&op=m&m=StartUp&"); if (gParamValue >=0 && gParamValue <= 255) { analogWrite(ledPin, gParamValue); } else { printLine("wrong parameter value"); } } что при включении светодиода, контроллер посылает на сервер еще запрос /objects/?object=ThisComputer&op=m&m=StartUp для чего это делается? Я пока не могу до конца разобраться с настройкой кода, выполняемого на сервере. И не могу понять некоторые вещи. Например, если я делаю управление светом. В интерфейсе есть выключатель "ВКЛЮЧЕНИЕ СВЕТА". В случае если контроллер подключен, то я нажимаю на эту кнопку, на контроллер посылается команда. На выходе контроллера получаем "1". Все правильно. Но, я перегружаю контроллер. На заданном выходе я получаю "0". А в интерфейсе все равно отображается, что свет включен. Если я правильно понимаю для этого надо воспользоваться одним из 2-х способов, которые описаны тут http://smartliving.ru/Main/DevIpPower9223 . Но пока я не осилил привязку. Хотя состояние получаю. Так вот, вопрос вот в чем. Не нужно сделать так, чтобы после каждого вызова команды на контроллере происходило примерно так: 1. Контроллер принял команду 5=ON 2. Делаем digitalWrite(5,HIGH); 3. Отсылаем на сервер что-то вроде /?P5=ON В этом случае контроллер будет посылать подтверждение того, что он действительно включил "1" на 5 пине.

Vit: код не компилируется....вываливаются ошибки....пробовал ide arduino 017,022,1.0.1 выложите кто нибудь переделанную код под одну из версий.... может какой библиотеки не хватает...

sochkasov: код не компилируется....вываливаются ошибки....пробовал ide arduino 017,022,1.0.1 выложите кто нибудь переделанную код под одну из версий.... может какой библиотеки не хватает... Vit, доброго времени суток. Я по той-же причине решил переписать "под себя" код написанный Сергеем. На данный момент сделано 2 рабочие прошивки. Информер и информер-исполнитель. Причем с несколько расширенным функционалом. Единственное, что я не стал делать поддержку подключения контроллера исполнителя через USB. В моем случае - только Ethernet. IDE Arduino 1.0.1 код выложил тут https://github.com/sochkasov/majordomo-arduino

Vit: код не компилируется....вываливаются ошибки....пробовал ide arduino 017,022,1.0.1 выложите кто нибудь переделанную код под одну из версий.... может какой библиотеки не хватает... Vit, доброго времени суток. Я по той-же причине решил переписать "под себя" код написанный Сергеем. На данный момент сделано 2 рабочие прошивки. Информер и информер-исполнитель. Причем с несколько расширенным функционалом. Единственное, что я не стал делать поддержку подключения контроллера исполнителя через USB. В моем случае - только Ethernet. IDE Arduino 1.0.1 код выложил тут https://github.com/sochkasov/majordomo-arduino спасибо, скачал , будем пробовать компилировать и эксперементировать))

lighthouse: Всем привет! sochkasov, спасибо за прошивки. Жду свой клон ардуины, как придет, сразу попробую :)

ser009: Я установил данную прошивку на Mega2560 Заработало. Помоги дописать прошивку, чтобы были дискретные входа и по 1-wire передавались данные на сервер

BATONS: я к стати тоже ищу прошивку к ардуино "эмулятор DS2450" или любого другого АЦП. может у кого есть? Хочется обрабатывать данные ардуиной и отсылать их по 1-Wire

ser009: В данный момент разбираюсь с прошивкой от sochkasov Вот на страничку информации попробовал добавить кнопки для тестирования выходов Вот сырой кусочек кода зажигает и тушит порт 3 /********************************************************************************************************************* * Кнопки для тестиролвания выходов **/ server.println(); server.println("<form METHOD=get action=\"http://192.168.8.120/command\">"); server.println("<input type=hidden name=\"3\", value=\"ON\">"); server.println("<input type=submit value=\"P3 On\">"); server.println("</form>"); server.println("<form METHOD=get action=\"http://192.168.8.120/command\">"); server.println("<input type=hidden name=\"3\" value=\"OFF\">"); server.println("<input type=submit value=\"P3 Off\">"); server.println("</form>"); server.println(); server.println("<form METHOD=get action=\"http://192.168.8.120/command\">"); server.println("<input type=hidden name=\"3\" value=\"LCLICK\">"); server.println("<input type=submit value=\"P3 LCLICK\">"); server.println("</form>"); server.println(); }

ser009: Натолкнулся вот на такой Web Server: https://github.com/sergiomokshin/Arduino-WebServer

ser009: Помогите дописать код для подключения датчика ворот и вывода температуры

ser009: Вот так выглядит кусок кода для опроса состояния входа * функция проверки входа **/ int pirPin = 7; // присваеваем 7 ноге название pirPin ... ... ... // Настройка портов на вывод pinMode (pirPin, INPUT); // Настройка порта как вход digitalWrite(pirPin, LOW); // Установить на 7 ноге низкий уровень ... ... ... void CheckMotion() { motionDetected = 0; if(digitalRead(pirPin) == HIGH){ Serial.println("yes"); motionDetected = 1;} else{/*Serial.println("no"); motionDetected = 0;*/} } Подскажите как сделать так чтобы данные не передавались постоянно в порт, а выходили только при изменении значение HIGH на LOW??? В порт постоянно передаются данные "no" При нажатии передается "yes"

sergejey: В своём скетче я делал так... Определял переменную состояния int old_pir=0; далее в loop() делал опрос: int currentPir=digitalRead(pirPin); if (currentPir!=(int)old_pir) { sprintf(buf, "GET /objects/?object=sensorMovementRemote1&op=m&m=statusChanged&status=%i HTTP/1.0", (int)currentPir); sendHTTPRequest(); old_pir=(int)currentPir; } таким образом отсылался запрос только если состояние менялось

gans: Всем доброго времени суток. У меня таже проблемма: Я пока не могу до конца разобраться с настройкой кода, выполняемого на сервере. И не могу понять некоторые вещи. Например, если я делаю управление светом. В интерфейсе есть выключатель "ВКЛЮЧЕНИЕ СВЕТА". В случае если контроллер подключен, то я нажимаю на эту кнопку, на контроллер посылается команда. На выходе контроллера получаем "1". Все правильно. Но, я перегружаю контроллер. На заданном выходе я получаю "0". А в интерфейсе все равно отображается, что свет включен. Если я правильно понимаю для этого надо воспользоваться одним из 2-х способов, которые описаны тут http://smartliving.ru/Main/DevIpPower9223 . Но пока я не осилил привязку. Хотя состояние получаю. Так вот, вопрос вот в чем. Не нужно сделать так, чтобы после каждого вызова команды на контроллере происходило примерно так: 1. Контроллер принял команду 5=ON 2. Делаем digitalWrite(5,HIGH); 3. Отсылаем на сервер что-то вроде /?P5=ON В этом случае контроллер будет посылать подтверждение того, что он действительно включил "1" на 5 пине. Залил на arduino прошивку от sochkasov, в веб-переменных состояние получаю но как правильно привязать к ним выключатель? Помогите пожулуйста чайнику :D хочется разобраться, уж больно интересный проект.

Urbas81: Подскажите такой момент, как переменную, которая получается при выполнении страницы на php, завести в свойство переменной в объектах. Если конкрено: допустим вычисляется восход солнца получаем значение $t1 $t1=date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset); как можно дальше $t1 завести в систему, чтоб ней дальше можно было работать, например для управления освещением или индикации на страницах.

anemcov: Подскажите такой момент, как переменную, которая получается при выполнении страницы на php, завести в свойство переменной в объектах. Если конкрено: допустим вычисляется восход солнца получаем значение $t1 $t1=date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset); как можно дальше $t1 завести в систему, чтоб ней дальше можно было работать, например для управления освещением или индикации на страницах. например, у объекта ThisComputer создаем свойство sunrise. Далее в скрипте просто вызываем sg('ThisComputer.sunrise',$1);

Urbas81: Подскажите такой момент, как переменную, которая получается при выполнении страницы на php, завести в свойство переменной в объектах. Если конкрено: допустим вычисляется восход солнца получаем значение $t1 $t1=date_sunrise(time(), SUNFUNCS_RET_STRING, $lat, $long, $zenith, $offset); как можно дальше $t1 завести в систему, чтоб ней дальше можно было работать, например для управления освещением или индикации на страницах. например, у объекта ThisComputer создаем свойство sunrise. Далее в скрипте просто вызываем sg('ThisComputer.sunrise',$1); но это если в скрипте писать, а у меня это отдельный файл sun.php который вызывается из меню, и в php это не проходит.

Urbas81: Продублировл функцию через сценарии, и оттуда через sg все получилось, спасибо за наводку, но интересно из внешнего файла это можно сделать?

anemcov: но это если в скрипте писать, а у меня это отдельный файл sun.php который вызывается из меню, и в php это не проходит. Через POST-запрос (анпример так) http://homeserver/objects/?object=sensorMovement1&op=m&m=statusChanged&status=1 скрипт можно передавать параметры Взято отсюда http://smartliving.ru/Main/ScSecurityWireless там же разобран принцип построения запроса

Urbas81: но это если в скрипте писать, а у меня это отдельный файл sun.php который вызывается из меню, и в php это не проходит. Через POST-запрос (анпример так) http://homeserver/objects/?object=sensorMovement1&op=m&m=statusChanged&status=1 скрипт можно передавать параметры Взято отсюда http://smartliving.ru/Main/ScSecurityWireless там же разобран принцип построения запроса ага, примерно понял, еще раз спасибо.

Urbas81: Уще вопрос, как сокращенно записать шаблон поиска preg_match("/(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)(0|1)/", $all, $OUT);

anemcov: А что надо найти? И в какой строке?

Urbas81: А что надо найти? И в какой строке? строка для поиска "0010111000110101", где 0 и 1 меняются в зависимости от состояния выхода, в зависимости от того 0 или 1 я вывожу соответствующую картинку, все работает, когда выражение пишу в таком виде как выше, но интересно как его сократить, т.е строка всегда имеет длину 16 символов, которые либо 0 либо 1, другого там ничего быть не может, вот и все.

anemcov: "/(0|1){16}/" Найти 16 раз 0 или 1 идущие подряд

Urbas81: "/(0|1){16}/" Найти 16 раз 0 или 1 идущие подряд это я наверное одно из первых попробовал, но не работает.

Urbas81: Можно ли из php посылать данные в com порт на сервере, гуглил, информация размытая, но вроде мне попадались файлы в системе которые отвечают за связь с комом или я не прав?

sergejey: Можно ли из php посылать данные в com порт на сервере, гуглил, информация размытая, но вроде мне попадались файлы в системе которые отвечают за связь с комом или я не прав? В саму систему MajorDoMo ничего такого не встроено, так что надо на самом деле гуглить и смотреть по примерам. Я сам для отправки чего-то в порт (ну и чтения) использую ArduinoGW (под windows) -- он может как мониторить порт, так и при необходимости туда отправлять данные.

[ Обсудить на форуме ]

 

MajorDomo

Информация

Проекты

Партнёры

edit SideBar

 
 
 

 

Blix theme adapted by David Gilbert, powered by PmWiki