RCSwitch Ethernet gate

C_3AXAPOB
Сообщения: 510
Зарегистрирован: Ср июн 08, 2016 4:17 pm
Благодарил (а): 124 раза
Поблагодарили: 101 раз

Re: RCSwitch Ethernet gate

Сообщение C_3AXAPOB » Вс фев 19, 2017 6:26 pm

ЕСПшка питается от usb проблем не должно быть.
Orange pi pc plus, megaD-2561, Xiaomi
--------------------------------------------------
http://connect.smartliving.ru/profile/908
TransMatrix
Сообщения: 186
Зарегистрирован: Вс май 28, 2017 9:24 am
Благодарил (а): 8 раз
Поблагодарили: 22 раза

Re: RCSwitch Ethernet gate

Сообщение TransMatrix » Вс май 28, 2017 9:44 am

C_3AXAPOB писал(а):ЕСПшка питается от usb проблем не должно быть.
Если не считать, что у этих передатчиков обычно питание от 12 должно идти...



Сооружаю сейчас гейт ESP-315-433-RX-TX... Ну и с МП3 плеером для будильника...
Для работы с двумя приемниками надо:
1. Копируем RCSwitch.h и RCSwitch.cpp в каталог с прогой, переименовываем их в RCSwitch1.h и RCSwitch1.cpp
2. Делаем ещё одну копию и обзываем RCSwitch2.h и RCSwitch2.cpp
3. В коде первых - заменяем автозаменой редактора все RCSwitch на RCSwitch1, во втором - на RCSwitch2
4.

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

#include "RCSwitch1.h" // Не <>, а ""!
#include "RCSwitch2.h" 

int ReciverPin315 = 12; // Пины приемников - у кого как
int ReciverPin433 = 5;

RCSwitch1 Remote315 = RCSwitch1(); 
RCSwitch2 Remote433 = RCSwitch2(); 
 
В сетапе:

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

  pinMode(ReciverPin315, FUNCTION_3); // Это ESP-специфика - пины без этого могут работать в режиме COM, i2c и т.п.
  Remote315.enableReceive((ReciverPin315)); // В принципе - пин у ЕСП = прерыванию, но можно через digitalPinToInterrupt(ReciverPin315) указать наверняка
  
  pinMode(ReciverPin433, FUNCTION_0);
  Remote433.enableReceive((ReciverPin433));
 
В цикле:
int value = 0;
if (Remote315.available()) {

value = Remote315.getReceivedValue();

if (value == 0) {
Serial.print("Unknown encoding");
} else {
Serial.print("Received 315 MHz ");
Serial.print( Remote315.getReceivedValue() );
Serial.print(" / ");
Serial.print( Remote315.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println( Remote315.getReceivedProtocol() );
}

Remote315.resetAvailable();
}

if (Remote433.available()) {

value = Remote433.getReceivedValue();

if (value == 0) {
Serial.print("Unknown encoding");
} else {
Serial.print("Received 433 MHz ");
Serial.print( Remote433.getReceivedValue() );
Serial.print(" / ");
Serial.print( Remote433.getReceivedBitlength() );
Serial.print("bit ");
Serial.print("Protocol: ");
Serial.println( Remote433.getReceivedProtocol() );
}
Как-то так. Оно работает.

Проблема тупо завести два экземпляра этого класса в том, что обработчик прерывания может быть только STATIC функцией, которая едина для всех экземпляров класса, в итоге обработчик "клинит" на том, что он не в курсе какое прерывание от какого экземпляра он обрабатывает сейчас!
В "ошибках" на гитхабе предлагалось завести массив обработчиков и хитрозадо задавать разные, но там выходил изврат полный...
beavisgood
Сообщения: 51
Зарегистрирован: Пт дек 18, 2015 5:42 pm
Благодарил (а): 20 раз
Поблагодарили: 10 раз

Re: RCSwitch Ethernet gate

Сообщение beavisgood » Ср янв 24, 2018 9:57 pm

Привет всем! Расскажу свои эксперименты по радиоканалу 433/315 мГц, может кому полезно будет, а то я долго въехать не мог.
Брал все готовое, но допиливал схему, сделал плату, скетч под ардуино тоже причесал. Поменял скрипт для MJD, и свойства объектов, подробно ниже...
Собрал свой вариант RCSwitch гейта на Arduino+ENC 433мГц, питание POE через кабель Ethernet, установка в распред коробку https://leroymerlin.ru/product/korobka- ... -18544031/
СпойлерПоказать
MyRCSwitch.jpg
MyRCSwitch.jpg (528.74 КБ) 5774 просмотра
Протестировал различные виды пультов и радиореле на 433мГц.
Выбрал для себя такие варианты:
СпойлерПоказать
RC_Relay.jpg
RC_Relay.jpg (435.98 КБ) 5774 просмотра
Сенсорные выключатели в подрозетник Vhome
СпойлерПоказать
VhomeLight.jpg
VhomeLight.jpg (68.55 КБ) 5774 просмотра
сенсорные радио пульты Vhome
СпойлерПоказать
VhomePult.jpg
VhomePult.jpg (306.36 КБ) 5774 просмотра
Вот в чем их преимущества:
1) Радиореле и выключатели Vhome могут запоминать несколько кодов, причем можно задать отдельно код на включение, выключение и переключение. В этом и заключается их главная фишка. Этот режим называется Latch, Inter Lock, защелка.
Для чего это надо?
Записываем код "ON" он, будет всегда только включать, независимо от количества посылок кода, тоже самое код OFF всегда выключит нагрузку, хоть нажимай кнопку сто раз. Другие реле тупо переключают ON-OFF-ON-OFF, и фактически умный дом не знает, в каком состоянии у нас находиться выход.... Так же можно посылать код с повтором например 10 раз, для надежности включения.
Далеко не у всех реле есть этот режим, например LIVOLO я так и не смог заставить работать в таком режиме.
2) выключатели в подрозетник Vhome работают разрыв провода, ноль не нужен
3) Дальность не большая, но лучше чем у обычных пультов брелков (для квартиры хватает)
3) стильный дизайн, сенсорные кнопки, три варианта цвета, с 1,2,3 линиями под нагрузку.
4) можно связать разные пульты, брелки, выключатели, датчики движения, датчики дыма, протечки, реле, розетки и пр...
5) ну и цена привлекательная, комплект пульт + выключатель от 9$ я брал тутhttps://de.aliexpress.com/store/product ... 0.0.aEOcCo

логика работы:
К одному радио реле я привязал три разных кода
1) Код включения нагрузки, отправляется с сервера MJD через RCSwitch гейт
2) Код выключения нагрузки, отправляется с сервера MJD через RCSwitch гейт
3) Код переключения, отправляю с сенсорного радиопульта, RCSwitch гейт тоже видит этот код и передает это событие в систему MJD.
В итоге этим радиореле можно управлять через умный дом, либо отдельным пультом, и при этом MJD знает включено реле или нет.
Т.е. есть обратная связь в таком виде. Плюс автономность, если сервер выйдет из строя, вы не останетесь без света, можно обойтись пультом.
Так же есть фишка, если нажать на пульте сразу две кнопки, то реле не сработает (типа ошибочный код оно не воспринимает), но этот код легко принимает RCSwitch гейт и можно использовать в MJD, как дополнительную опцию, например выключить свет везде,..... да любую функцию или сценарий.

Теперь про подключение к MJD
Импортировал класс RCSwitch и создал объект RCSwitch1 для него , свойства добавил как на картинке под спойлером
СпойлерПоказать
Class.png
Class.png (20.24 КБ) 5756 просмотров
Добавил сценарий с именем rcswitch, он принимает код пульта от EthernetGate RCSwitch, ищет есть ли объект с таким кодом, и меняет у него свойство status на противоположное (1 или 0), т.о. MJD узнает если пользователь меняет состояние из вне.
СпойлерПоказать

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

// Получаем от гейта строку типа: id= 5600515-24bit-P1
$id=$params['rcswitch'];
// Парсим строку
$vals = explode("-", $id);

// Сохраняем значения в переменные для удобства
$RCvalue=$vals[0];
$Format =$vals[1];
$Proocol=$vals[2];

if ($RCvalue)
  {
    //DebMes("RCvalue: $RCvalue");
    //sayReply('Получен код от передатчика '.$RCvalue,2);
      
  }

// Получаем объекты MJD c именем RCSwitch 
$objects=getObjectsByClass("RCSwitch");

$obj = $RCvalue;


foreach($objects as $obj) 
{
   // IdSwitch 
  $IdSwitch = getGlobal($obj['TITLE'].".IdSwitch");
   //@@@ Доделать проверку на протокол и битность
  if ($IdSwitch == $vals[0])
  {
    if (getGlobal($obj['TITLE'].".status"))
    {
        setGlobal($obj['TITLE'].".status", 0);
    }
    else
    {
        setGlobal($obj['TITLE'].".status", 1);
    }
    
    DebMes($obj['TITLE'].":IdSwitch ".$IdSwitch."=".$vals[0]);
    //sayReply('Получен код от передатчика'.$id,2);
    return;
  } 
Добавил софт выключатель на панель управления, привязал его к объекту RCSwitch1, свойство status, если нажать кнопку на радио пульте, то здесь тоже поменяется.
Для того чтобы включить или выключить радиореле из MJD нужно передать в EthernetGate код, этот параметр берем из свойства объекта IdOn или IdOff. Это делает метод switch.
СпойлерПоказать
object.jpg
object.jpg (30.63 КБ) 5756 просмотров
Правда есть пока засада, не могу разобраться, может кто поможет!!??
Если в этот софт выключатель на панеле управления я привязываю только свойство status, то все ОК, при нажатии на радиопульте вижу изменение ВКЛ, ВЫКЛ. РАБОТАЕТ
Если в этот софт выключатель на панеле управления я привязываю только метод switch, то все ОК, при клике он отправляет код в EthernetGate IdOn или IdOff. РАБОТАЕТ
НО, если привязать сразу и свойство status и метод switch, то начинаются глюки, EthernetGate зависает, MJD тоже начинает тормозить, т.к. не дожидается ответа.
В отладке выдает ошибку GetURL to http://192.168.0.141/?RCSwitch,5600524,24 (source eval) finished with error: Operation timed out after 45001 milliseconds with 0 bytes received
У меня есть предположение, что происходит "коллизия", т.к. клик по софт переключателю меняет свойство status, и в тоже время клик вызывает метод switch, который тоже меняет status, и система "сходит с ума".
Что делать непонятно.

Кто задумает собрать RCSwitch гейт, вот архив Gerber файлы для платы, схема, перечень элементов, сборочный чертеж, скетч для ардуино.

Платы я заказываю в Китае, делают быстро, качественно, и очень дешево, но есть ограничения размер платы 10см*10см, и количество 10шт, что вполне неплохо для небольших домашних проектов, можно конечно и больше размер сделать, но тогда стоимость увеличивается в разы.
вот три популярных сайта для заказа которыми я пользуюсь:
1) www.allpcb.com Месяц назад я тут заказал платы за 5$ с бесплатной доставка почтой Китая, сейчас дороже, не знаю может акция была какая то...
2) www.pcbway.com Тут стоимость плат 10шт. с учетом доставки 12-15$, выбор цветов больше, еще можно добавить в заказ бесплатные макетные платы.
3) www.jlcpcb.com тут стоимость плат 10 плат с учетом доставки 10-12$.
Тут я оставил реферальные ссылки, если перейти по ним и зарегистрироваться, то дают приветственные бонусы для скидки, и вам и мне, так что жми :-)
Качество у всех примерно одинаковое, лучше чем у некоторых Российских производителей.
Вложения
MyRCS_EthernetGate_V1.0.zip
(2.13 МБ) 246 скачиваний
За это сообщение автора beavisgood поблагодарили (всего 2):
skysilver (Чт янв 25, 2018 1:40 am) • kawkay (Чт янв 25, 2018 10:15 am)
Рейтинг: 2.33%
Linux DietPi, OrangePi-PC, MyMegaD328
Connect: http://connect.smartliving.ru/profile/689
shse
Сообщения: 6
Зарегистрирован: Чт фев 01, 2018 11:43 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: RCSwitch Ethernet gate

Сообщение shse » Чт фев 01, 2018 11:53 pm

beavisgood писал(а): НО, если привязать сразу и свойство status и метод switch, то начинаются глюки, EthernetGate зависает, MJD тоже начинает тормозить, т.к. не дожидается ответа.
В отладке выдает ошибку GetURL to http://192.168.0.141/?RCSwitch,5600524,24 (source eval) finished with error: Operation timed out after 45001 milliseconds with 0 bytes received
У меня есть предположение, что происходит "коллизия", т.к. клик по софт переключателю меняет свойство status, и в тоже время клик вызывает метод switch, который тоже меняет status, и система "сходит с ума".
Что делать непонятно.
мучался с тем же самым дня три - в итого в методах на включение и выключение в запросе getURL('http://192.168.2.234/rcremote?cmd=96829081&per=70', 0); надо было всего-то добавить длительность посылки &per=70

мне помогло.
За это сообщение автора shse поблагодарил:
beavisgood (Пт фев 02, 2018 8:03 am)
Рейтинг: 1.16%
beavisgood
Сообщения: 51
Зарегистрирован: Пт дек 18, 2015 5:42 pm
Благодарил (а): 20 раз
Поблагодарили: 10 раз

Re: RCSwitch Ethernet gate

Сообщение beavisgood » Пт фев 02, 2018 8:05 am

shse писал(а):
beavisgood писал(а): НО, если привязать сразу и свойство status и метод switch, то начинаются глюки, EthernetGate зависает, MJD тоже начинает тормозить, т.к. не дожидается ответа.
В отладке выдает ошибку GetURL to http://192.168.0.141/?RCSwitch,5600524,24 (source eval) finished with error: Operation timed out after 45001 milliseconds with 0 bytes received
У меня есть предположение, что происходит "коллизия", т.к. клик по софт переключателю меняет свойство status, и в тоже время клик вызывает метод switch, который тоже меняет status, и система "сходит с ума".
Что делать непонятно.
мучался с тем же самым дня три - в итого в методах на включение и выключение в запросе getURL('http://192.168.2.234/rcremote?cmd=96829081&per=70', 0); надо было всего-то добавить длительность посылки &per=70

мне помогло.
Спасибо за совет, проверю.
Linux DietPi, OrangePi-PC, MyMegaD328
Connect: http://connect.smartliving.ru/profile/689
Ответить