Страница 1 из 1

проверять связанный объект в определённое время

Добавлено: Вт дек 06, 2016 7:05 pm
artemon25
добрый всем вечер подскажите возможно ли чтобы допустим данные передаваемые по mqtt с фоторезистора алиса мониторила только днём а ночью не проверяла. у меня свет включается сам от фоторезистора который стоит на ардуино но ночью в 24.00 сам выключается и в этот момент датчик включает свет заново. я так понимаю что надо написать код в котором будет : если сейчас время меньше допустим 22.00 то связанный объект "фоторезистор" считывается и в это время соответственно в шаблонах поведения у меня прописано что при снижение освещённости включается свет и соответственно если время больше 22.00 то объект не считывается. Подскажите как написать этот код или может быть сделать как то по другому.
Заранее всем спасибо. жду ответов

Re: проверять связанный объект в определённое время

Добавлено: Ср дек 07, 2016 10:49 am
nick7zmail
Очень сильно зависит от того, что и как у вас подключено к ардуино. Самый нормальный вариант (это лично мое мнение, может отличатся от мнения других))) - поставить AMS на ардуину, к ней датчик и релюшка...

В амс есть часы. Исходя из этого - прямо в скетче ардуины можно прописать когда надо включать свет по срабатыванию датчика, а когда нет. Это все будет работать автономно без МД. А в мд по mqtt, например, передавать когда что включалось/выключалось, и при необходимости получать команды от МД (тоже по mqtt).

Как что у вас подключено и чем прошито - понятия не имею, по-этому самый простой вариант дать не могу)) Тот что выше - один из более-менее правильных, по моему мнению. Ибо я склоняюсь к тому, что устройства должны работать автономно, на случай если МД отвалится. А мд их должен просто объединять в одну сеть.

Re: проверять связанный объект в определённое время

Добавлено: Ср дек 07, 2016 7:52 pm
artemon25
я извиняюсь за столь пространственный вопрос. Если честно у меня мозгов не хватило как поставить AMS на UNO и вообще возможно ли это так как имею ардуино уно и шилд 5100 закчал на него вот этот скетч состоит из двух частей
1ый
СпойлерПоказать
#include <SPI.h> // Ethernet shield
#include <Ethernet.h> // Ethernet shield
#include <PubSubClient.h> // MQTT
#include <Servo.h>
#include <dht.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Servo servo;

// Задаём mac и ip адреса в Локальной сети
byte mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip{192, 168, 1, 74}; //ip Адрес Ethernet Shild'a Arduino
IPAddress server{192, 168, 1, 3}; //ip Адрес для MQTT Брокера

// Шапка Функции Callback (обратный вызов)
void callback(char* topic, byte* payload, unsigned int length);


EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

// Функция Callback
void callback(char* topic, byte* payload, unsigned int length)
{
// Выделяем необходимое кол-во памяти для копии payload
byte* p = (byte*)malloc(length);
// Копирование payload в новый буфер
memcpy(p, payload, length);
client.publish("home/data/status/sensor", p, length);
// Освобождаем память
free(p);
}

#define id_connect "myhome-kitchen"
#define Prefix_subscribe "myhome/Kitchen/"

///////////////Объявляем порты ввода-вывода
#define ServoPin 3 //Порт к которому подключен сервопривод

const int start_DI_pin []= {2, 4, 5}; // Порты Ввода
int n_DI_pin = sizeof(start_DI_pin) / sizeof(start_DI_pin[0])-1; //Вычисляем длинну массива

const int start_DO_pin []= {6, 7}; //Порты Вывода
int n_DO_pin = sizeof(start_DO_pin) / sizeof(start_DO_pin[0])-1; //Вычисляем длинну массива

int DI[] = {0, 0, 0};
int old_DI[] = {0, 0};

///////////////////////////Переменные для работы с освещением//////////////////////////////////////
int ServoAngle = 100; //Угол сервопривода при включении
int flag = 0;
int flag2 = 0;
int pause = 0;

//------------------------------------------- Sensors -------------------------------------------//
const int MQ7_Pin = A0; // Куда подключили MQ7
//int MQ7Value = 0;
int MQ7Value = analogRead(MQ7_Pin);


const int foto_Pin = A1; // устанавливаем входную ногу для Фоторезистора
//unsigned int fotoValue = 0; // цифровое значение фоторезистора
unsigned int fotoValue = analogRead(foto_Pin);

#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS_sensors(&oneWire);
// 28 FF F2 5C 53 15 2 97
DeviceAddress addr_T1 = { 0x28, 0xFF, 0xC8, 0x30, 0xA1, 0x15, 0x03, 0xB0 };

float T1 = 0;

dht DHT;
#define DHT22_PIN 2
float Hout = 0;
float Tout = 0;


////////////////////////////////////////////////////////////////////////////
void setup() {
//Serial.begin(57600);
// Serial.println("start");
//Объявляем порты Digital inputs/outputs
for(int i=0 ;i<=n_DI_pin; i++) { pinMode (start_DI_pin , INPUT); }
digitalWrite(5, HIGH); //Окно
digitalWrite(4, HIGH); //Объемник
for(int i=0 ;i<=n_DO_pin; i++) { pinMode (start_DO_pin , OUTPUT); }

Ethernet.begin(mac, ip);
if (client.connect(id_connect)) {
getSensors();
control();
// client.publish("myhome/Kitchen/Change_Counter", "0");
// client.publish("myhome/Kitchen/Temp_room", "0");
// client.publish("myhome/Kitchen/Humidity_room", "0");
// client.publish("myhome/Kitchen/Temp_radiator", "0");
// client.publish("myhome/Kitchen/Temp_in", "0");
// client.publish("myhome/Kitchen/Lux", "0");
// client.publish("myhome/Kitchen/Servo", "0");
// client.publish("myhome/Kitchen/MQ7", "0");

client.subscribe("myhome/Kitchen/#");
}
}
/////////////////////////////////////////////////////////////////////////
void loop() {
client.loop();
control();
getSensors();
if (!client.connected()) {
if (client.connect(id_connect)) {
control();
getSensors();
client.subscribe("myhome/Kitchen/#");
}
}
}

и второй
СпойлерПоказать
//--------------------------------- Functions ---------------------------------//
/////////////////////////////////От Брокера//////////////////////////////////////////////
void callback_iobroker(String strTopic, String strPayload){
if (strTopic == "myhome/Kitchen/Servo"){
ServoAngle=strPayload.toInt();
if (ServoAngle >= 0 && ServoAngle <= 255){
servo.attach(ServoPin);
//delay(200); //ждем 2 секунды
servo.write(ServoAngle); //ставим вал под 0
delay(1000); //ждем 2 секунды
//client.publish("myhome/Kitchen/Servo", b);
servo.detach();
}
}
}

////////////////////////////////////Брокеру/////////////////////////////////////
void control(){

if(digitalRead(5)==HIGH && flag==0) { //если окно открыто
client.publish("myhome/Kitchen/Window", "1");
flag=1;
}
if(digitalRead(5)==LOW && flag==1){//если окно закрыто
client.publish("myhome/Kitchen/Window", "0");
flag=0;//обнуляем переменную flag
}

if(digitalRead(4)==HIGH && flag2==0) { // Если есть движение
client.publish("myhome/Kitchen/Motion", "1");
flag2=1;
}
if(digitalRead(4)==LOW && flag2==1){// Если нет движения
client.publish("myhome/Kitchen/Motion", "0");
flag2=0;//обнуляем переменную flag
}
}
///////////////////////////////Данные сенсоров////////////////////////////////////

void getSensors () {

MQ7Value = analogRead(MQ7_Pin);
fotoValue = analogRead(foto_Pin); // считываем значение с фоторезистора
// ServoAngle = analogRead(2);

//Обработка данных датчика DHT22. Подключение к порту цифровому P9 Arduino
//Глобальные переменные Hout и Tout типа флоат - влажность (%) и температура (град. С)
if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
Hout = DHT.humidity;
Tout = DHT.temperature;
}
if (Hout == 0 || Tout == 0){
delay (1000);
if (DHT.read22(DHT22_PIN)== DHTLIB_OK) {
Hout = DHT.humidity;
Tout = DHT.temperature;
}
}
//Обработка данных цифровых датчиков температуры типа DS18B20.
//Шина 1-Wire на цифровой пин P8 Arduino.
//Подключено 2 датчика температуры, адреса задаются в секции глобальных констант "Sensors"
//Три значение температуры T1, T2, типа float (град. С).
DS_sensors.requestTemperatures();
T1 = DS_sensors.getTempC(addr_T1);

///////////////////////Паблик данных сенсоров////////////////////////
if (pause == 50 || pause == 0){

char b[5];
String char_Hout = String(Hout);
char_Hout.toCharArray(b,5);
client.publish("myhome/Kitchen/Humidity_room", b);

String char_Tout = String(Tout);
char_Tout.toCharArray(b,5);
client.publish("myhome/Kitchen/Temp_room", b);

String char_T1 = String(T1);
char_T1.toCharArray(b,5);
client.publish("myhome/Kitchen/Temp_radiator", b);

String char_fotoValue = String(fotoValue);
char_fotoValue.toCharArray(b,4);
client.publish("myhome/Kitchen/Lux", b);

String char_ServoAngle = String(ServoAngle);
char_ServoAngle.toCharArray(b,4);
client.publish("myhome/Kitchen/Servo", b);

String char_MQ7Value = String(MQ7Value);
char_MQ7Value.toCharArray(b,4);
client.publish("myhome/Kitchen/MQ7", b);

pause = 1;
}
else pause++;
}

он меня устраивает и хорошо работает а насчёт того что вдруг МД отвалится так оно может быть что роутер заглючит и что свет выключится так что мне бы понять как сделать чтоб МД следил за временем и исполнял те функции что мне бы хотелось если это вообще возможно конечно.
я так понимаю надо что то на подобия

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

if (timeBetween("00:00", "22:00")){ 
чтоб проверялось значение в MQTT и если

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

myhome/Kitchen/Lux <150
меньше допустим 150 чтоб сработал сценарий

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

RunScript('Включи свет в зале') 
мне бы это скидать всё и написать в код PHP

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

if (timeBetween("00:00", "22:00")){
context_activate($38); 

}
 
и наверное этот код надо написать в шаблоне поведения или как то по другому проверять этот код.
заранее спасибо за помощь

Re: проверять связанный объект в определённое время

Добавлено: Чт дек 08, 2016 6:25 am
nick7zmail
artemon25 писал(а): и наверное этот код надо написать в шаблоне поведения или как то по другому проверять этот код.
заранее спасибо за помощь
Как то подругому 100% )) "Шаблоны поведения" Это реакция на слова в чате...оно вам врят ли надо...
Если я правильно понял задачу - вам нужно включать свет по датчику, при этом учитывая время...в код ардуины лень вчитываться, но сделать предлагаю примерно так:

1) для начала разберемся куда вписывать...есть в объектах класс таймер, там объект clockchime и методы OnNewHour и OnNewMinute. Соответственно первый выполняется каждый час, второй каждую минуту. Это то что надо для периодических проверок каких либо параметров.
2) что вписывать...если эта функция действительно существует (я про timebetween), то используя её

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

if (timeBetween("22:00", "00:00")){
if (gg('mqtt.lux')<150) {
cm('light.on');//метод на включение света
}
} else {
cm('light.off');//метод на выключение света
}
 

Re: проверять связанный объект в определённое время

Добавлено: Чт дек 08, 2016 9:57 am
Denis_k
при этом не должно быть проверки состояния объекта light?
как то странно включать/выключать ежеминутно то, что уже включено/выключено

Re: проверять связанный объект в определённое время

Добавлено: Чт дек 08, 2016 10:28 am
nick7zmail
Denis_k писал(а):при этом не должно быть проверки состояния объекта light?
как то странно включать/выключать ежеминутно то, что уже включено/выключено
Ну во-первых можно не ежеминутно а раз в час, наверное, достаточно будет...

Ну если хотите - можно сделать...вам ничего не мешает, просто добавятся пару строк...лично у меня дома Noolite, и там при посылке повторного сигнала включения на уже включенный девайс - ничего не меняется, лампочка не моргает...тем более обратной связи нет, по-этому на подсознательном уровне принебрег проверкой статуса))

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

if (timeBetween("22:00", "00:00")){
  if (gg('mqtt.lux')<150) {
    if(gg('light.status')==0) {
      cm('light.on');//метод на включение света
    }
  }
} else {
  cm('light.off');//метод на выключение света
} 

Re: проверять связанный объект в определённое время

Добавлено: Пт дек 09, 2016 8:23 am
artemon25
if (gg('mqtt.lux')<150) {
mqtt.lux мне надо создать где то объект с таким названием или просто вписать вместо этого myhome/Kitchen/Lux значение которого находится в устройствах раздел mqtt

Re: проверять связанный объект в определённое время

Добавлено: Пт дек 09, 2016 11:09 am
nick7zmail
artemon25 писал(а):myhome/Kitchen/Lux значение которого находится в устройствах раздел mqtt
Разве так работает? Я с mqtt очень мало работал, но по-моему там можно зайти в модуль, нажать редактировать, и привязать к значению объект.свойство. Прямое обращение типа myhome/Kitchen/Lux врят ли сработает....но если работает - то можно и так, че бы нет))

Re: проверять связанный объект в определённое время

Добавлено: Вт дек 13, 2016 5:45 pm
artemon25
nick7zmail спасибо за помощь и за разъяснения моего вопроса. остановился на вот таком коде

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

if (timeBetween("08:00", "22:00")){
if (gg('ThisComputer.lux')<200) 
 runScript('Включи свет в зале');
}
вставил его в onNewMinute как вы и советовали чуть его поправил и проверку отключил потому что когда свет включается данные повышаются и сценарий не повторяется.

Re: проверять связанный объект в определённое время

Добавлено: Вт дек 13, 2016 10:09 pm
nick7zmail
Рад помочь)