Считать статус Lamp(объекта) Arduino c Ethernet шилдом get

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

Модератор: immortal

atlo
Сообщения: 19
Зарегистрирован: Пт мар 11, 2016 12:57 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Считать статус Lamp(объекта) Arduino c Ethernet шилдом get

Сообщение atlo » Вс мар 20, 2016 8:49 am

Добрый день!
Недавно нашел этот проект и решил попробовать разобраться. Мне необходимо сделать управление одним реле (подключенным к ардуино уно через езернет шилд), через сайт и по кнопке. major установлен на cubianboard и должен общаться с arduino uno через локальную сеть посредством get запроса.
Создал объект Lamp1 как сделано на видео https://youtu.be/KwUI0k8viqA Основы настройки Majordomo
Нарисовал небольшой скрипт который переключает этот объект Lamp1 по нажатию на ардуино кнопки на пине 3

Код: Выделить всё

#include <Ethernet.h>
#include <SPI.h>
//mac address для получения сети
byte mac[] = { 0xee, 0x2b, 0xab, 0xa4, 0xd4, 0x9d }; // RESERVED MAC ADDRESS
EthernetClient client;
/////////////////////датчики//////////////////
int button = 3; // объявляем кнопку на пине 3
int led = 9; // объявляем пин 9 для реле
void setup()
{
  pinMode(led, OUTPUT); // пин 9 слушает выход
// объявляем что слушают датчики
pinMode(button, INPUT); //кнопка слушает вход
Serial.begin(9600);
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP"); 
}
Serial.print("IP = ");
Serial.println(Ethernet.localIP()); // вывожу полученый ip
}

void loop()
{
Gerk();
}

void Gerk(){
if (digitalRead(button) == HIGH/*LOW*/) { 
Serial.println("connecting to server...");
 if (client.connect("192.168.1.44",80)) {
//client.connect("192.168.1.44",80)) { 
    Serial.println("making HTTP request...");
  // Создаем GET HTTP-запрос:
  //  client.println("GET  /objects/?object=Lamp1&op=m&m=turnOn& HTTP/1.1");//отправляю переменную t со значением 1
  client.println("GET /objects/?object=Lamp1&op=m&m=switch& HTTP/1.1");
    client.println("HOST: 192.168.1.44");
    client.println(); 
} 
if (client.connected()) { 
client.stop(); 
}
delay(100);
}
Скрипт работает и переключает объект.
но мне необходимо, чтобы arduino опросило статус Lamp1 на major опросил(не понимаю как обратиться к статусу Lamp1) через get запрос и если статус Lamp1 = 1 включено, то после этого включить пин 9 на ардуино.
Или второй вариант, через планшет переключить на сцене объект Lamp1, ардуино через get запрос считает статус и включит пин 9
Может я что то до конца не понимаю в работе major тогда объясните, может где - то по другому прописать можно
Можно как-то вернуть статус устройства если выключаю я Lamp1
http://192.168.1.44:80/objects/?object= ... &m=turnOff&
включаю
http://192.168.1.44:80/objects/?object= ... m&m=turnOn&
Как вернуть статус Lamp1????????????
http://192.168.1.44:80/objects/?object= ... m&m=Status& или checkState ??????????
atlo
Сообщения: 19
Зарегистрирован: Пт мар 11, 2016 12:57 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение atlo » Пн мар 21, 2016 8:17 am

нашел такую тему Самый простой пример на форуме
http://majordomo.smartliving.ru/forum/v ... %80#p27751
но в данном случае исполнительное устройство должно иметь постоянный статический ip адрес, что меня не совсем устраивает.
Может кто нибудь помочь мне пояснить каким образом можно получать данные с сервера о статусе объекта.
Если я что то не так написал скорректируйте меня.
sly28
Сообщения: 5
Зарегистрирован: Пт мар 11, 2016 1:48 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение sly28 » Вт мар 22, 2016 2:10 am

Приветствую! Хоть я и сам новичок, но давай попробуем разобраться!
atlo писал(а):Может кто нибудь помочь мне пояснить каким образом можно получать данные с сервера о статусе объекта.
Данные получить-то можно, например, можно для Вашего объекта Lapm1 создать отдельный метод, который можно вызывать get-запросом с ардуины... Этот метод отправлял бы на Вашу ардуину тоже get запрос со статусом объекта, а на ардуине останется только получмть и разбирать этот запрос.
только вот МДМ нужно знать, куда их отправлять, а если у Вас динамический IP на ардуине, то нужно каким-то образом отслеживать этот IP.

Как Вариант, можно создать еще один объект для самой ардуины, и в этом объекте создать свойство, в котором хранить ip, и при подключении ардуины первым делом отправлять запрос, в котором передавать свой ip и сохранять его в это свойство, тогда в вышеописанном методе объекта Lamp1 отправлять данные на IP, взятый из свойства объекта ардуины...

Не исключаю, что может есть и более простые способы, но на данном этапе моего "мажордомного" развития я иных методов пока не вижу)
atlo
Сообщения: 19
Зарегистрирован: Пт мар 11, 2016 12:57 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение atlo » Вт мар 22, 2016 12:22 pm

Я с вами полностью согласен, что для ардуины необходим статический ip адрес, а я хочу от этого уйти(стат ip должен быть только у МЖД), поэтому мне необходимо чтобы ардуино сама цеплялась к МДЖ и спрашивала о статусе Lamp1
Пока у меня получилось реализовать это так
Я порылся в базе db_terminal и нашел параметр CUR_VALUE который отвечает за статус этой самой Lamp1
с помощью коряво написанного php файла(я просто далеко не phpист и думаю его надо доработать) который я я положил в директорию /var/www/status.php я прописал код php

Код: Выделить всё

<?php
//соединяемся с mysql
 $db = mysql_connect("localhost","",""); 
mysql_select_db("db_terminal",$db);
//делаю запрос базе в таблице commands.  CUR_VALUE отвечает как раз за статус Lamp1(лампочка) Запрос сделал по ИДЕНТИФИКА́ТОРу (ID) 
$query = "SELECT  `ID` ,  `CUR_VALUE` FROM  `commands` WHERE  `ID` =  '118'";
// $query = "SELECT * FROM `commands` WHERE `LINKED_OBJECT` =  'Lamp1'";//`TITLE`= 'Лампочка1'"; // не хочет обрабатывать запрос из-за русских букв 
//$query = "SELECT * FROM  `commands` WHERE  `LINKED_OBJECT` =  'Lamp1'"; // отбирает несколько значений
// Формируем запрос
 $query_rele = mysql_query($query); 
// Выполняем запрос 
$row = mysql_fetch_array($query_rele);
Do { $text = $row['CUR_VALUE'];
}
 while ($row = mysql_fetch_array($query_rele));
echo $text;  //вводим значение значение на экран
 mysql_query($query,$link);
 mysql_close($link);
?>
и считал его ардуиной

Код: Выделить всё

#include <Ethernet.h>
#include <SPI.h>
#include <Wire.h>


//mac address для получения сети
byte mac[] = { 0xee, 0x2b, 0xab, 0xa4, 0xd4, 0x9d }; // RESERVED MAC ADDRESS
EthernetClient client;

/////////////////////////////реле/////////////////
int buff=0; // переменная для установки значения 1 или 0 (вкл или выкл) и последующего приема запроса с сервера
const int rele = 9; //подключаем пин реле для включения реле
 int button = 3; // объявляем кнопку
void setup()
{

  ////////////////////////////реле//////////////////////////////
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW); 
// объявляем что слушают датчики
pinMode(button, INPUT); //кнопка слушает вход

if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP"); 
}
Serial.print("IP = ");
Serial.println(Ethernet.localIP());

}

void loop()
{
rele_(); //считываем значение из файла на веб сервере
Gerk();
}

void Gerk(){
if (digitalRead(button) == HIGH/*LOW*/) { 
Serial.println("connecting to server...");
 if (client.connect("192.168.1.44",80)) {
//client.connect("192.168.1.44",80)) { 
    Serial.println("making HTTP request...");
  // Создаем GET HTTP-запрос:
  //  client.println("GET  /objects/?object=Lamp1&op=m&m=turnOn& HTTP/1.1");//отправляю переменную t со значением 1
  client.println("GET /objects/?object=Lamp1&op=m&m=switch& HTTP/1.1"); // переключаем Lamp1 на сервере
    client.println("HOST: 192.168.1.44");
    client.println(); 
} 
if (client.connected()) { 
client.stop(); 
}
delay(100);
}
}

//////////////////////////////////////управляем реле///////////////////////
void rele_(){
  ///////////////////////////////////////реле////////////////////////
if (client.connect("192.168.1.44",80)) {
Serial.println("making HTTP request...");
delay(100);
// Создаем GET HTTP-запрос:
client.print("GET /status.php?");//считываем переменную с сервера
client.println("HOST: 192.168.1.44");
client.println(); 
delay(100);
while (client.available())
 {
      char c = client.read();
      Serial.write(c);
        if ( c=='1')           //если 1 то ставим флаг в buff =1
        {
        buff=1;
        }
        if ( c=='0')          //если 2 то ставим флаг в buff =0
        {
         buff=0;
        }
      }
           client.stop();
      client.flush();
      delay(100); 
  }
  else 
  {
   client.stop();
   delay(400);
   client.connect("192.168.1.44", 80);
  }
  Serial.println(buff);
  if ( buff==1)             //если  флаг в buff =1 то включаем реле
        {
        digitalWrite (rele, HIGH);
        }
        if (buff==0)//было else         //если  флаг в buff =0 то выключаем реле
        {
        digitalWrite(rele, LOW);
        }
  delay(400);
 }
 


У меня получилось то что я хотел( я нажимаю кнопку на ардуино у меня загорается светодиод и загорается Lamp на сцене и если я нажимаю на экране на сцене Lamp1 то у меня переключается лампочка и реле на ардуино), правда код коряво написан и его надо дорабатывать, но мне пока надо было для понимания , а как то же самое реализовать в МДЖ через интерфейс я так и не нашел
Если кто то объяснит как это можно реализовать с помощью методов в МДЖ то буду только рад.
А пока надо файл php доработать, чтобы можно было несколько параметров отправлять через get запрос, но для этого придется поглубже в php залезть. Если кто доработает php файл для отправки нескольких параметров (к примеру 2-3 реле ) то буду только рад.
За это сообщение автора atlo поблагодарил:
samum (Вт мар 22, 2016 6:02 pm)
Рейтинг: 1.16%
atlo
Сообщения: 19
Зарегистрирован: Пт мар 11, 2016 12:57 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение atlo » Чт мар 24, 2016 9:58 am

Помогите дописать код
Отправляю данные о статусе Lamp1 через get запрос , выводятся данные
http://ip-адрес/status.php?rele=0&rele2=Lamp1
Код php странички

Код: Выделить всё

<!DOCTYPE html> <html lang="ru">
<html lang="ru">
<head>
<!-- <meta charset="utf-8" /> -->
<body>
<?php
//соединяемся с mysql
include_once("./config.php");
$db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db("db_terminal",$db);
$query = "SELECT  `ID` ,  `CUR_VALUE`, `LINKED_OBJECT` FROM  `commands` WHERE  `ID` =  '118'";
// Формируем запрос
$query_rele = mysql_query($query); 
// Выполняем запрос 
$row = mysql_fetch_array($query_rele); 
Do { $text = $row['CUR_VALUE'] ; $text2 = $row['LINKED_OBJECT'] ;
}
while ($row = mysql_fetch_array($query_rele));

//echo $text;
// Get
echo '<form method="get">';
echo '<input type="hidden" name="rele" value="'.$text.'" />';
echo '<input type="hidden" name="rele2" value="'.$text2.'" />';
echo '</form>';

mysql_query($query,$link);
mysql_close($link);
?>
<scripT type="text/javascript">
var f = document.forms[0];
f.submit();
</script>
</body>

Дальше пытаюсь считать данные ардуиной

Код: Выделить всё

#include <Ethernet.h>
#include <SPI.h>
#include <Wire.h>


//mac address дл€ получени€ сети
byte mac[] = { 0xee, 0x2b, 0xab, 0xa4, 0xd4, 0x9d }; // RESERVED MAC ADDRESS
EthernetClient client;

/////////////////////////////реле/////////////////
int buff=0; // переменна€ дл€ установки значени€ 1 или 0 (вкл или выкл) и последующего приема запросас сервера
const int rele = 9; //подключаем пин реле дл€ включени€ камеры
 int button = 3; // объ€вл€ем геркон на вход дверь
void setup()
{
Serial.begin(9600);
  ////////////////////////////реле//////////////////////////////
  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW); 
// объ€вл€ем что слушают датчики
pinMode(button, INPUT); //кнопка слушает вход

if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP"); 
}
Serial.print("IP = ");
Serial.println(Ethernet.localIP());

}

void loop()
{
rele_(); //считываем значение из файла на веб сервере
Gerk();
}

void Gerk(){
if (digitalRead(button) == HIGH/*LOW*/) {
  digitalWrite (rele, HIGH); 
Serial.println("connecting to server...");
 if (client.connect("192.168.1.2",80)) { 
    Serial.println("making HTTP request...");
  // —оздаем GET HTTP-запрос:
  //  client.println("GET  /objects/?object=Lamp1&op=m&m=turnOn& HTTP/1.1");//отправл€ю переменную t со значением 1
  client.println("GET /objects/?object=Lamp1&op=m&m=switch& HTTP/1.1");
    client.println("HOST: 192.168.1.2");
    client.println(); 
} 
if (client.connected()) { 
client.stop(); 
}
delay(100);
}
}

//////////////////////////////////////управл€ем реле///////////////////////
void rele_(){
  ///////////////////////////////////////реле////////////////////////
 if (client.connect("192.168.1.2",80)) {
Serial.println("making HTTP request...");
delay(100);
// —оздаем GET HTTP-запрос:
client.print("GET /status.php?rele=");//считываем переменную с сервера
client.println("HOST: 192.168.1.2");
client.println(); 
delay(100);
while (client.available())
 {
      char c = client.read();
      Serial.write(c);

        if ( c=='1')           //если 2 то ставим флаг в buff =1
        { //Serial.println("c=1");
        buff=1;
        }
        if ( c=='0')          //если 3 то ставим флаг в buff =0
        {//Serial.println("c=0");
         buff=0;
        }
      }
           client.stop();
      client.flush();
      delay(100); 
  }
  else 
  {
   client.stop();
   delay(400);
   client.connect("192.168.1.2",80);
  }
//Serial.println("buff");
  Serial.println(buff);
  if ( buff==1)             //если  флаг в buff =1 то включаем реле
        {
        digitalWrite (rele, HIGH);
        }
        if (buff==0)//было else         //если  флаг в buff =0 то выключаем реле
        {
        digitalWrite(rele, LOW);
        }
  delay(400);
 }

 
Но выяснил что ардуино принимает вот такой ответ

making HTTP request...
HTTP/1c=1
.1c=1
20c=0
0c=0
OK
Date: Thu, 24 Mar 20c=0
1c=1
6 0c=0
6:44:27 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.45-0c=0
+deb7u2
Vary: Accept-Encoding
Content-Length: 322
Connection: close
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html> <html lang="ru">
<html lang="ru">
<head>
<!-- <meta charset="utf-8" /> -->
<body>
<form method="get"><input type="hidden" name="rele" value="0c=0
" /><input type="hidden" name="rele2" value="Lamp1c=1
" /></form><scripT type="text/javascript">
var f = document.forms[0c=0
];
f.submit();
</script>
</body>

Объясните на примере как получить значение value ?
Я понимаю что нужно парсить строку, но как это делается не понимаю
dimens
Сообщения: 13
Зарегистрирован: Пн апр 11, 2016 7:33 pm
Благодарил (а): 5 раз
Поблагодарили: 4 раза

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение dimens » Вт апр 19, 2016 5:02 pm

А для чего считывать Ардуине с МД, если ардуина лампой управляет?
Я правильно понимаю: чтобы ардуина отслеживала изменение Свойства Объекта и согласно полученному значению Свойства выполняла переключение ?


Отправлено с моего ME371MG через Tapatalk
atlo
Сообщения: 19
Зарегистрирован: Пт мар 11, 2016 12:57 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение atlo » Ср апр 20, 2016 1:26 pm

Да правильно понимаете, ардуино отслеживает и при изменение свойства объекта переключает реле.
В принципе я сделал что хотел
Страничка status1.php читает данные из базы и выдает значения, а ардуино считывает и переключает

Код: Выделить всё

<?php
//соединяемся с mysql
//соединяемся с mysql
include_once("./config.php");
include_once("./lib/loader.php");

// connecting to database
$db = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); 
mysql_select_db("db_terminal",$db);


$result = MYSQL_QUERY("SELECT ID,CUR_VALUE FROM commands where ID=118 or ID=119")
 or die("Error: " . mysql_error());
    print"<table>";
   while ($row = MYSQL_FETCH_ARRAY($result, MYSQL_BOTH)) 
    {
    print "<tr>";
    for ($k = 0; $k <= 1; $k++) { print "<td class=td_log>$row[$k]</td>"; }
    print "</tr>";
    }
    print"</table>";
  MYSQL_FREE_RESULT($result);


mysql_query($query,$link);
mysql_close($link);
?>
код ардуино

Код: Выделить всё

/*
Ардуино получает ip адрес и начинает проверять статус реле на сайте(реализовано 2 реле моожно добавить сколь позволяет пины ардуины)
по нажаитию кнопки отправляется запрос на сайт для включения реле
*/
#include <SPI.h>
#include <Ethernet.h>
//переменные
const int rele = 3; //подключаем пин светодиод(реле)
int button = 9; // кнопка включения(switch)

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte server[] = { 192, 168, 1, 44 };
byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02
};
EthernetClient client;

void setup() {

  pinMode(rele, OUTPUT);
  digitalWrite(rele, LOW); 
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
      // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for (;;)
      ;
  }
  // Выводим полученный IP address:
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }
  Serial.println();
  
  }
void loop() {
  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /status1.php? HTTP/1.0");
    client.println();
  } else {
    Serial.println("connection failed");
  }
  delay(70);
rele_();
}

void rele_(){
  //проверяем статус лампочки
String data;
if (client.available()) {
  char c = client.read();
  data = client.readStringUntil('\0'); // в data записываем поток с сервера
 //  Serial.print(data); // проверка
  // ищем данные с конца потока
  //проверяем статус реле с id 118 
  if (data.lastIndexOf("class=td_log>118</td><td class=td_log>1")>0)
   {
    digitalWrite (rele, HIGH);
    Serial.print("188 HIGH");
    }
    if (data.lastIndexOf("118</td><td class=td_log>0")>0)
    {
      digitalWrite(rele, LOW);
      Serial.print("188 LOW");
    }
     Serial.print("   ");
     //проверяем статус реле с id 119
    if (data.lastIndexOf("119</td><td class=td_log>1")>0){Serial.print("189 yes");}
    if (data.lastIndexOf("119</td><td class=td_log>0")>0){Serial.print("189 no");}
    client.stop();
    Serial.println();
    Serial.println("disconnecting.");
    }
  //проверяем статус кнопки
if (digitalRead(button) == HIGH/*LOW*/) {
  digitalWrite (rele, HIGH); 
Serial.println("connecting to server...");
 if (client.connect(server, 80)) {
    Serial.println("making HTTP request...");
  // Создаем GET HTTP-запрос:
  //  client.println("GET  /objects/?object=Lamp1&op=m&m=turnOn& HTTP/1.1");//отправляю переменную t со значением 1
  client.println("GET /objects/?object=Lamp1&op=m&m=switch& HTTP/1.1");
    client.println("HOST: server");
    client.println(); 
} 
 client.stop(); 
Serial.println("disconnecting to server222222222...");
}
}

  
dagenwail
Сообщения: 5
Зарегистрирован: Чт май 26, 2016 9:09 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение dagenwail » Чт май 26, 2016 9:25 pm

Я реализовал ответ из ардуино через протокол MQTT в этом видео все подробно описано https://youtu.be/4O-2dJwRQtg
,запрос осуществляется к ардуине через гет запрос. модуль MQTT меняет значение свойства status,
все работает все нормально. Только одно но, если "Выключатель" в положении On то при изменении status через MQTT на 0(Выключен) "Выключатель" перещелкивается на Off, а если в обратном порядке status изменяется через MQTT то ползунок выключателя стоит на месте. Если обновить страницу то "выключатель" будет стоят в положение On. Как сделать чтоб выключатель скакал туда сюда?
ipz
Сообщения: 238
Зарегистрирован: Чт ноя 26, 2015 10:54 pm
Благодарил (а): 38 раз
Поблагодарили: 45 раз

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение ipz » Чт май 26, 2016 10:48 pm

Я бы в скрипте на стороне MDM воспользовался встроенной функцией:
getGlobal('ObjectName.Value'), она же gg('ObjectName.Value')
dagenwail
Сообщения: 5
Зарегистрирован: Чт май 26, 2016 9:09 pm
Благодарил (а): 1 раз
Поблагодарили: 0

Re: Считать статус Lamp(объекта) Arduino c Ethernet шилдом

Сообщение dagenwail » Пт май 27, 2016 1:50 am

В скрипте выключателя?
Ответить