Ну что, давайте тестить!
Несколько утверждений:
- МегаД может сама послать нам на сервер различные get запросы, когда посчитает нужным. Например по коммутации входа, превышению температуры, или циклично. Они поступят в метод incomingMessage.
- Мы сами можем послать (спросить) Мегу get запросом из метода getData о чем либо. Например о состоянии нужного порта или сразу всех портов. Ответ так же будет передан в метод incomingMessage
- Метод getOutput теперь больше не нужен. Пока оставил его, но в будущем наверное уберу.
Структура метода incomingMessage:
Три больших абзаца. В каждом свое ветвление с группами Case по номерам портов.
Первый абзац для обработки сообщения со всеми портами в одной длинной строке. Сработает либо по цикличному ответу Меги, либо по запросу callMethod('MegaD1.getData', array('port'=>'all'));
Второй абзац для обработки статусов портов, которые мы сами спросили с помощью callMethod('MegaD1.getData', array('port'=>1)); Тут надо запомнить, что если мы спрашиваем состояние например первого порта, то значит эти данные нам нужны для чего то, и должна быть группа команд в Case 1: для передачи полученного ответа нужным объектам.
Третий абзац для обработки get запросов меги, когда например мы коммутируем какой то вход. В нем реализованы обработки разного вида нажатий. Простое, двойное, длинное, и отпускание после удержания. Сюда же надо будет потом добавить обработку сообщения о превышении температуры.
Получается, что все у нас расписывается в методе incomingMessage. Вот по этому я и бросил метод getOutput, выбрав на замену вариант вопроса из getData с передачей ответа в incomingMessage.
getOutput позволял просто записать значение порта в указанное свойство объекта. Но для Меги этого мало. Взять даже вариант датчика
температуры/влажности. Чтобы разделить значения на два свойства, нужен хоть простенький но код. Реализовать все это можно без труда в incomingMessage.
Пока что класс на тестировании. Выкладываю только тут. Файл обновлять не надо. Жду суровой критики и железных предложений!
К вопросу о периодичности опроса. Допустим нам надо опрашивать нашу мегу раз в минуту, и получать от нее данные о всех портах. Тогда в onNewMinute пишем callMethod('MegaD1.getData', array('port'=>'all')); Если же так часто опрашивать не надо, никто не запретит написать вначале if и смотря на $m, что позволит делать опросы через необходимый интервал времени или же по любому другому условию.