Arduino+EthernetW5100+MDM

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

Модератор: immortal

serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino+EthernetW5100+MDM

Сообщение serghei » Ср сен 14, 2016 5:55 pm

В главной ветке АМС проскочила инфа про модуль "ключ" . Я его завел на первой кнопке. работает очень шустро, типа твоих 4 релюшек.
Я пробовал :). Вообще-то логику работы можно проследить по коду, но перевожу на простой человеческий язык.

Код этого модуля кочует из версии в версию и берёт своё начало ещё с тех времён, когда АМС-а вообще не было. Работа ключа зависит от переменной goLight, которая раньше выставлялась посылками

rele4=0 или rele4=1

из MajorDoMo. Мной (по причине того, что я вообще забыл, как MajorDoMo выглядит :) ) и серее всего никем не используется, но вы можете подключить электронный ключ и в любом месте скетча управлять им, изменяя состояние переменной goLight.
Мы не понимаем друг друга. Я в браузере АМС просто нажимаю на кнопку. А вот как то же самое сделать в МД я не знаю. Но копать надо в сторону как в цитате.
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino+EthernetW5100+MDM

Сообщение nick7zmail » Ср сен 14, 2016 6:00 pm

serghei писал(а): Мы не понимаем друг друга. Я в браузере АМС просто нажимаю на кнопку. А вот как то же самое сделать в МД я не знаю. Но копать надо в сторону как в цитате.
Блин...кнопка в браузере отправляет на какую-то ссылку, я у тя и прошу эту ссылку....

А из мд чтобы переключить пользуемся

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

getUrl('Тут эта самая ссылка'); 
Команду можно привязать к шаблону поведения "Включи что-то"...а голосовое распознавание на телефоне - tasker+autovoice.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
AlexF5
Сообщения: 7
Зарегистрирован: Ср сен 14, 2016 12:39 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Arduino+EthernetW5100+MDM

Сообщение AlexF5 » Чт сен 15, 2016 9:05 am

В общем разобрался! Выкладываю скетч:
СпойлерПоказать
#include <Ethernet.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_GFX.h>
#include <SPI.h>

// MAC-адрес нашего устройства
byte mac[] = { 0x00, 0x2A, 0xF6, 0x12, 0x68, 0xFC };
// ip-адрес устройства
byte ip[] = { 192, 168, 0, 73 };
// ip-адрес удалённого сервера
byte rserver[] = { 192, 168, 0, 243 }; // измените на свой

Adafruit_BMP085 bmp;
int cycle_counter=0;
int releState=0;
int relePin = 6;
int old_pressure1=0;
int press1=0;
int incomingInt = 0;
int current_temp1=0;
int old_temperature1=0;
String url = "";
int maxLength=25;
String commandReceived;
String parametersReceived;
int MDcommand;
unsigned long MDparameter;

char buf[80];
EthernetServer server(80);
EthernetClient rclient; // 80-порт.

void sendHTTPRequest() {
Serial.println(buf);
if (rclient.connect(rserver,80)) {
Serial.println("OK");
rclient.println(buf);
rclient.println("Host: 192.168.0.243");
rclient.println();
delay(2000);
rclient.stop();
} else {
Serial.println("FAILED");
}

}
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(115200);
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
pinMode(relePin, OUTPUT);
}
void loop()
{
int valid_sensor=0;
delay(100); // задержка в 0.1 сек.
cycle_counter++;
if (cycle_counter>600) {
cycle_counter=0;
}
// TEMP SENSOR 1
float current_temp1=0;
Serial.println("Temper");
current_temp1=bmp.readTemperature(); // получаем температуру
Serial.println(current_temp1);

if ((old_temperature1!=(int)current_temp1)) {
int temp1 = (current_temp1 - (int)current_temp1) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=sensorRoom&op=m&m=tempChanged&t=%02d.%02d HTTP/1.0", (int)current_temp1, abs(temp1));
sendHTTPRequest();

}
old_temperature1=(int)current_temp1;
//--------------------------------------------

//----------------------------------------------
float current_press1=0;
Serial.println("Press");
current_press1=(bmp.readPressure())/133.1; // получаем температуру
Serial.println(current_press1);

if ((old_pressure1!=(int)current_press1)) {
//int press1 = (current_press1 - (int)current_press1) * 100; // выделяем дробную часть
sprintf(buf, "GET /objects/?object=pressRoom&op=m&m=pressChanged&t=%03d HTTP/1.0", (int)current_press1);
sendHTTPRequest();

}
old_pressure1=(int)current_press1;

delay(2000);
//------------------
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (url.length() < maxLength) {
url+=(c);
}
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == '\n' && currentLineIsBlank) {

Serial.print("HTTP request: ");
Serial.println(url);
if (url.indexOf("?")>=0) {

int PosB=url.indexOf("?")+1;
int PosE=url.indexOf("HTTP");
if (url.indexOf(",")>=0) {
// command has parameters
int PosP=url.indexOf(",");
commandReceived=url.substring(PosB,PosP);
parametersReceived=url.substring(PosP+1,PosE-1);
} else {
// command does not have parameters
commandReceived=url.substring(PosB,PosE-1);
parametersReceived="";
}

MDcommand = commandReceived.toInt();

MDparameter = parametersReceived.toInt();

}

// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html><head><title>Arduino</title></head><body>");
client.println("</body><html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}// end if (client.available())
} //END while (client.connected())
// give the web browser time to receive the data
delay(1);
// close the connection:
url = "";
client.stop();
Serial.println("client disconnected");

//Обработка команд
if (MDcommand == 1) {//Включить свет в холле 1=вкл, 0-выкл
//int stat = MDparameter; //в моём случае не нужно
digitalWrite(6, HIGH);
}
else
if (MDcommand==0) {
//int stat = MDparameter;
digitalWrite(6, LOW);
}
}
}

Что происходит на МДМ. Создаем кнопку(в моем случае лампочка), создаем методы turnOn и turnOff. В них соответственно прописываем

$this->setProperty("status",0);
$cmdUrl = "http://192.168.0.73:80/command?1,1"; //включение (первая единица - это номер выключателя, вторая единица - вкл)
//соответственно выключение будет 1,0
getURL($cmdUrl,0);

Собственно и все. Остается ещё добавить на ардуино проверку состояния из МДМ т.к после внезапного выключения света - состояние на ардуино сбросится, а это негативно может сказаться на комфорте.. Над этим я ещё подумаю, как сделаю - отпишу сюда же...
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino+EthernetW5100+MDM

Сообщение nick7zmail » Чт сен 15, 2016 10:05 am

Я вот эту команду и требовал)) http://192.168.0.73:80/command?1,1

Ток вопрос - почему команда на включение, а статус ставим 0?))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
AlexF5
Сообщения: 7
Зарегистрирован: Ср сен 14, 2016 12:39 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Arduino+EthernetW5100+MDM

Сообщение AlexF5 » Чт сен 15, 2016 1:01 pm

nick7zmail писал(а):Я вот эту команду и требовал)) http://192.168.0.73:80/command?1,1

Ток вопрос - почему команда на включение, а статус ставим 0?))

Опечатка! В статусе на включение стоит 1, конечно.
VladPTZ
Сообщения: 397
Зарегистрирован: Вт май 31, 2016 6:56 pm
Откуда: Россия Карелия Петрозаводск
Благодарил (а): 96 раз
Поблагодарили: 57 раз

Re: Arduino+EthernetW5100+MDM

Сообщение VladPTZ » Пт сен 16, 2016 7:35 pm

У вас в коде

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

sprintf(buf, "GET /objects/?object=sensorRoom&op=m&m=tempChanged&t=%02d.%02d HTTP/1.0", (int)current_temp1, abs(temp1));  
Можно взглянуть на реализацию метода tempChanged ?
Сервер МД на x86 micro pc ssd + HDD, OC Debian, терминал Xiaomi Redmi note 7
Мои исходники для мд управляемых устройств https://github.com/vgamaev/ESPMDDEVICE
AlexF5
Сообщения: 7
Зарегистрирован: Ср сен 14, 2016 12:39 pm
Благодарил (а): 1 раз
Поблагодарили: 1 раз

Re: Arduino+EthernetW5100+MDM

Сообщение AlexF5 » Пн сен 19, 2016 10:42 am

VladPTZ писал(а):У вас в коде

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

sprintf(buf, "GET /objects/?object=sensorRoom&op=m&m=tempChanged&t=%02d.%02d HTTP/1.0", (int)current_temp1, abs(temp1));
Можно взглянуть на реализацию метода tempChanged ?
//$params['t']
$old_temp=$this->getProperty('temp');
$t=round($params['t'],1);
$this->setProperty('temp',$t);
if ($t>$old_temp) {
$d=1;
} elseif ($t<$old_temp) {
$d=-1;
} else {
$d=0;
}
$this->setProperty('direction',$d);
$this->setProperty("updated",time());
$this->setProperty("updatedTime",date("H:i",time()));
ghost13
Сообщения: 22
Зарегистрирован: Пт сен 02, 2016 8:01 pm
Благодарил (а): 2 раза
Поблагодарили: 2 раза

Re: Arduino+EthernetW5100+MDM

Сообщение ghost13 » Вт сен 20, 2016 10:23 am

подскажите как вывести температуру в сцену
Profd
Сообщения: 34
Зарегистрирован: Пн авг 22, 2016 9:41 am
Благодарил (а): 15 раз
Поблагодарили: 2 раза

Re: Arduino+EthernetW5100+MDM

Сообщение Profd » Чт ноя 10, 2016 1:07 am

Подскажите а как получать данные в МД от этой связки в мотод вроде добавляю но данные не меняются
Ответить