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

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

Модератор: immortal

Ответить
artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

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

Сообщение artemon25 » Вт дек 06, 2016 7:05 pm

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

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

Сообщение nick7zmail » Ср дек 07, 2016 10:49 am

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

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

Как что у вас подключено и чем прошито - понятия не имею, по-этому самый простой вариант дать не могу)) Тот что выше - один из более-менее правильных, по моему мнению. Ибо я склоняюсь к тому, что устройства должны работать автономно, на случай если МД отвалится. А мд их должен просто объединять в одну сеть.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

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

Сообщение artemon25 » Ср дек 07, 2016 7:52 pm

я извиняюсь за столь пространственный вопрос. Если честно у меня мозгов не хватило как поставить 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); 

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

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

Сообщение nick7zmail » Чт дек 08, 2016 6:25 am

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');//метод на выключение света
}
 
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Denis_k
Сообщения: 587
Зарегистрирован: Сб мар 19, 2016 7:24 pm
Благодарил (а): 299 раз
Поблагодарили: 27 раз

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

Сообщение Denis_k » Чт дек 08, 2016 9:57 am

при этом не должно быть проверки состояния объекта light?
как то странно включать/выключать ежеминутно то, что уже включено/выключено
MD на raspberry pi3
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Чт дек 08, 2016 10:28 am

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');//метод на выключение света
} 
За это сообщение автора nick7zmail поблагодарили (всего 2):
Denis_k (Чт дек 08, 2016 10:54 am) • samum (Вс янв 15, 2017 9:21 pm)
Рейтинг: 2.33%
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

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

Сообщение artemon25 » Пт дек 09, 2016 8:23 am

if (gg('mqtt.lux')<150) {
mqtt.lux мне надо создать где то объект с таким названием или просто вписать вместо этого myhome/Kitchen/Lux значение которого находится в устройствах раздел mqtt
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Пт дек 09, 2016 11:09 am

artemon25 писал(а):myhome/Kitchen/Lux значение которого находится в устройствах раздел mqtt
Разве так работает? Я с mqtt очень мало работал, но по-моему там можно зайти в модуль, нажать редактировать, и привязать к значению объект.свойство. Прямое обращение типа myhome/Kitchen/Lux врят ли сработает....но если работает - то можно и так, че бы нет))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
artemon25
Сообщения: 112
Зарегистрирован: Чт авг 25, 2016 10:33 pm
Благодарил (а): 15 раз
Поблагодарили: 6 раз

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

Сообщение artemon25 » Вт дек 13, 2016 5:45 pm

nick7zmail спасибо за помощь и за разъяснения моего вопроса. остановился на вот таком коде

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

if (timeBetween("08:00", "22:00")){
if (gg('ThisComputer.lux')<200) 
 runScript('Включи свет в зале');
}
вставил его в onNewMinute как вы и советовали чуть его поправил и проверку отключил потому что когда свет включается данные повышаются и сценарий не повторяется.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Вт дек 13, 2016 10:09 pm

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