Создать новый объект класса из сценария

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

Модератор: immortal

Ответить
Toutlemond
Сообщения: 27
Зарегистрирован: Ср дек 05, 2012 10:58 am
Благодарил (а): 0
Поблагодарили: 1 раз

Создать новый объект класса из сценария

Сообщение Toutlemond » Чт окт 01, 2020 9:07 am

Подскажите, как проще сделать следующее:
У меня есть класс неких устройств скажем Device. С рядом свойств и методов
Я могу создать объект Device12345. И мое устройство будет с ним синхронизироваться и все такое.

Но Сейчас хочу включать много таких устройств и так лень их прописывать.

Хочется чего то такого:
Устройство включилось первый раз - вошло в сеть послало GET запрос на какой то скрипт(сценарий типа NewDevice) и передало свой номер(рандомный 54321) и айпи.

А скрипт создал уже в системе новый объект такого класса - Device54321 . Ну и дальше оно работает само собой.
Опять же что бы не лезьб в устройство не смореть какой айпи оно получило... Включил, указал свой вайфай - усе поехало!

Я понимаю что могу в базу просто написать и все такое - но лень - наверно уже как то кем то такое реализовано ведь? :-D
Думал MQTT отправлять в какой то топик - но как то костылевато...
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Создать новый объект класса из сценария

Сообщение tarasfrompir » Чт окт 01, 2020 2:22 pm

Toutlemond писал(а):
Чт окт 01, 2020 9:07 am
Подскажите, как проще сделать следующее:
У меня есть класс неких устройств скажем Device. С рядом свойств и методов
Я могу создать объект Device12345. И мое устройство будет с ним синхронизироваться и все такое.

Но Сейчас хочу включать много таких устройств и так лень их прописывать.

Хочется чего то такого:
Устройство включилось первый раз - вошло в сеть послало GET запрос на какой то скрипт(сценарий типа NewDevice) и передало свой номер(рандомный 54321) и айпи.

А скрипт создал уже в системе новый объект такого класса - Device54321 . Ну и дальше оно работает само собой.
Опять же что бы не лезьб в устройство не смореть какой айпи оно получило... Включил, указал свой вайфай - усе поехало!

Я понимаю что могу в базу просто написать и все такое - но лень - наверно уже как то кем то такое реализовано ведь? :-D
Думал MQTT отправлять в какой то топик - но как то костылевато...
Примерно таким занимался модуль SSDP finder
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
xor
Сообщения: 2040
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Создать новый объект класса из сценария

Сообщение xor » Пт окт 02, 2020 2:54 am

Toutlemond писал(а):
Чт окт 01, 2020 9:07 am
Подскажите, как проще сделать следующее:
У меня есть класс неких устройств скажем Device. С рядом свойств и методов
Я могу создать объект Device12345. И мое устройство будет с ним синхронизироваться и все такое.

Но Сейчас хочу включать много таких устройств и так лень их прописывать.

Хочется чего то такого:
Устройство включилось первый раз - вошло в сеть послало GET запрос на какой то скрипт(сценарий типа NewDevice) и передало свой номер(рандомный 54321) и айпи.

А скрипт создал уже в системе новый объект такого класса - Device54321 . Ну и дальше оно работает само собой.
Опять же что бы не лезьб в устройство не смореть какой айпи оно получило... Включил, указал свой вайфай - усе поехало!

Я понимаю что могу в базу просто написать и все такое - но лень - наверно уже как то кем то такое реализовано ведь? :-D
Думал MQTT отправлять в какой то топик - но как то костылевато...
функция addClassObject($class_name, $object_name, $system = '') не поможет?
Toutlemond
Сообщения: 27
Зарегистрирован: Ср дек 05, 2012 10:58 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Создать новый объект класса из сценария

Сообщение Toutlemond » Пт окт 02, 2020 9:58 am

xor писал(а):
Пт окт 02, 2020 2:54 am
функция addClassObject($class_name, $object_name, $system = '') не поможет?
ОГОНЬ!
Это именно то что мне и надо. Я знал что есть метод :-D Надо бы код с шторм бросить чтоб проще ориентироваться было...
Изображение
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Создать новый объект класса из сценария

Сообщение Divan » Пт окт 02, 2020 7:46 pm

Можно поподробнее об этом? Распишите от и до. Что и как это работает. Какие устройства добавляются. Это может пригодиться другим.
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Toutlemond
Сообщения: 27
Зарегистрирован: Ср дек 05, 2012 10:58 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Создать новый объект класса из сценария

Сообщение Toutlemond » Вт окт 06, 2020 1:30 pm

Конечно!
Все просто есть у меня устройства разные . но все по сути однотипные просто выполняют разные роли. на Esp

Есть у них класс - вот он
Изображение

Я хочу добавить новое устройство.

Ранее я вынужден был включить его,
зайти в созданную им сеть
прописать настройки на свою сеть вот так :
Изображение

А потом когда он перезагрузится искать его на роутере в ДХСП а посе ручонками создавать ему обьект класса.

А теперь же все куда проще

Когда оно включится и поняло что у него есть настройка на мою сеть :

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

 if (ssidFromEprom != 0) {
    // соединяемся с известными сетями
    connectToAP2();
    // Проверяем есть ли мы в мажердоме
    testOrCreateObject();
  } else {
    // или создаем свою сеть
    setUpAP();
  }
  
Оно дергает посылку кипАлайв, вот так

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

void testOrCreateObject() {
  
  String ansver;
  ansver = SendToServer("keepalive", "alive", 1); // отправим сообщение что мы живы  посмотрим ответ.
  Serial.println("Send Alive signal");
  Serial.println(ansver);
  if (ansver.toInt() == 1) {
    Serial.println("Sensor's object is created. Alive updated");
  } else {
    ansver = CreateServerObject(contNameFromEprom);
    Serial.println("Send Create Server Object");
    Serial.println(ansver);
  }
}
 
Если keepalive ему ответил единицей - то все норм работаем как обычно порой шлем ему приветы.

А если он ничего не ответил то объекта нету - создадим его методом который любезно сообщил XOR.

Примерно вот так :

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

String CreateServerObject(String whVName) {

  Serial.println("");
  String station, getData, Link;
  String host1 = "";
  host1 = ip1byte;
  host1 += ".";
  host1 += ip2byte;
  host1 += ".";
  host1 += ip3byte;
  host1 += ".";
  host1 += ip4byte;
  char charVar[sizeof(host1)];
  host1.toCharArray(charVar, sizeof(charVar) + 1);
  const char * host = charVar; // ip or dns

  Serial.println("Create Server Object");
  HTTPClient http;   

  //http://10.170.1.121/objects/?script=AddNewDevice&id=334455
  
  getData = "?script=AddNewDevice";
  getData += "&id=";
  getData += whVName;
 Serial.println(whVName);
 
  Link = "http://";
  Link += String(host) ;
  Link += "/objects/" + getData;
 Serial.println(Link);
  http.begin(Link);     //Specify request destination

  int httpCode = http.GET();            //Send the request
  String payload = http.getString();    //Get the response payload

  Serial.println(httpCode);   //Print HTTP return code
  Serial.println(payload);    //Print request response payload

  http.end();  //Close connection

  delay(50);
  return payload;
}
Ну тут надо прибраться в коде да и немаловажно добавить чтобы он айпи передавал. Еще допишу.
Но один фиг они теперь знают друг друга и я могу уже оперировать объектом в мажордоме чтобы говорить этому девайсику что делать.

Ну вообще тут в соседней ветке мне предлагают перейти на тасмоту или еспизи. я конечо прошью пару девайсов. обязательно. Но почему то изобретение велосипеда у меня в крови... :-D
Ответить