• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Еще раз о выключателе

Алексей.

Active member
@anthony3d Не могу понять немножко странный код.
в функции switchLED меняете значение переменной iCan на false и тут-же меняете iCan на true
Код:
    function switchLED(chk) {
      iCan = false;
      if (chk.checked) {
        ajaxLoad('LEDON');
        switchState = true;
      }
      else {
        ajaxLoad('LEDOFF');
        switchState = false;
      }
      //console.log(switchState);
      iCan = true;
    }
между присваиванием false и true вызываете ajaxLoad которая никак её iCan не использует.
между присваиванием false и true проходит, я думаю, миллисекунда, может и меньше.

Код:
window.setInterval(function(){
      if (iCan) ajaxLoad('STATE');
    }, 1000);
устанавливаете интервал на выполнение ajaxLoad в случае если iCan равен true, он почти всегда такой, вероятность поймать значение false ничтожна мала.
Если вы выключите esp на несколько секунд и на запросы ajax перестанут приходить ответы, очередной запрос подвиснет в ожидании, а установленный интервал будет раз секунду выполнять ajaxLoad и плодить новые подвисшие запросы.
 

anthony3d

New member
window.setInterval(function(){ — исполняется по таймеру.
И хотя истинной мультизадачности тут нет, я на всякий случай запрещаю исполнение резидентной функции на время работы кода по событию.
(Старая привычка)
 

anthony3d

New member
̶И̶ ̶х̶о̶т̶я̶ ̶и̶с̶т̶и̶н̶н̶о̶й̶ ̶м̶у̶л̶ь̶т̶и̶з̶а̶д̶а̶ч̶н̶о̶с̶т̶и̶ ̶т̶у̶т̶ ̶н̶е̶т̶
(UPD: Стоп! Я все время забываю, что это JavaScript, и он исполняется в браузере!
Тогда тут и полная мультизадачность, и процессоры, и вот это вот всё..)
 

Алексей.

Active member
И хотя истинной мультизадачности тут нет, я на всякий случай запрещаю исполнение резидентной функции на время работы кода по событию.
Запрет на миллисекунду как то влияет на поведение? И как часто ловится эта ситуация, сработал интервал, и в этот-же момент инициировали очередной ajax запрос (не выполнили его, а только дали задание).
Тогда тут и полная мультизадачность, и процессоры, и вот это вот всё..)
Я вам об этом и говорю, когда один запрос ещё не завершен (если esp по разным причинам не ответил), вы интервалом начинаете следующий.
 

anthony3d

New member
Вот я и запрещаю интервал!
А ошибки AJAX здесь остаются:
ajaxRequest.onreadystatechange = function() {
if(ajaxRequest.readyState == 4 && ajaxRequest.status==200) {
 

anthony3d

New member
Только мерзкая релюшка клацает при включении...
Но это — аппаратный глюк ESP. Лечится только аппаратными же средствами.
Как поборю — напишу.

IMG_20191210_113157.jpg IMG_20191210_113207.jpg IMG_20191210_113544.jpg
 

Алексей.

Active member
Вот я и запрещаю интервал!
А ошибки AJAX здесь остаются:
ajaxRequest.onreadystatechange = function() {
if(ajaxRequest.readyState == 4 && ajaxRequest.status==200)
;)))
Вы выполняете асинхронный запрос:
1. Задаете метод и url и асинхронный режим ajaxRequest.open("GET",ajaxURL,true);
2. Устанавливаете обработчик изменения состояния обработки запроса ajaxRequest.onreadystatechange = function() { т.е. говорите браузеру, когда состояние обработки запроса изменится, выполни этот код.
3. Говорите браузеру начинай запрос ajaxRequest.send();
Время выполнение этих пунктов очень маленькое, какой смысл запрещать выполнение, ведь поймать это практически невозможно.
 

anthony3d

New member
Я же сказал — старая привычка. Возможно, вредная.

А насчет «поймать ... практически невозможно», у меня есть пара историй, где невозможное оказалось возможным.

1. 1989-й год. Вычислительный центр университета, класс ПЭВМ. MS-DOS 4.1
Входит лаборант и громко рассказывает новость, прочитанную в журнале «Компьютер» (до интернетов новости шли медленно):
«А вы знаете, что в DOS найден баг? Если запустить format /xxxxxx (шесть иксов), то команда без спроса и без экранного вывода начинает форматировать тот диск, на котором стоит.»
Все в шоке, а одна студентка говорит: «Я — знаю. У меня однажды так получилось...».

2. 1999-й год. Отдыхаю я с семьей в Ялте, в пансионате. И каждое утро мы выходим на набережную мимо невероятно крутого ресторана «К.Вальтер». Посетители этого ресторана, совершенно рафинированные граждане, как на старом фото — все в смокингах и бабочках, с тросточками (ну или мне так казалось). В окнах ресторана выставлены модели парусников, но не китайские, а настоящие, которые фанатики-моделисты делают, все как у реальных кораблей, только меньше в 32 раза. Охрана ресторана — какие-то нинзя, невидимые, в черных облегающих костюмах, стилизованных под пиджаки и брюки.
Но однажды утром мы обнаружили, что корабли в окнах — поломаны. Потому что случилось невозможное: рафинированные в смокингах напились и буянили ночью, валились прямо на эти модели, да еще и рыгали, небось, при этом. И никакие нинзя им помешать не смогли.

Поэтому лучше обработать вероятность исполнения функции по таймеру в неподходящий момент и предотвратить его.
 

pvvx

Активный участник сообщества
Почему-то setTimeout() не сработал. Я даже не стал разбираться.
Поверил StackOverflow
What's the easiest way to call a function every 5 seconds in jQuery?
У неактивного приложения javascript 'время' понятие расплывчатое. Зависит от эксплорера. Он вам вместо 5 секунд запросто сделает 100 при неактивности страницы...
 

pvvx

Активный участник сообщества
JS исполняется только в браузере компьютера, только пока открыта страница вашего выключателя. Вы собираетесь целый день сидеть и смотреть на страничку своего выключателя в браузере?
Как я понимаю, вы откроете страничку, увидите состояние выключателя, включите или выключите его, если нужно, закроете страничку. Все.
Давно решено: Progressive Web Apps (PWA) - функционируют как нативные приложения.
Введение: PWA — это просто
 

pvvx

Активный участник сообщества
Безобразие с этим XML.
Круглые сутки выключатель стоит и ждет нажатие кнопки на включение. И происходит это раз 10 в день, если мы дома и не происходит вообще если мы уехали на месяц.
А каждую секунду исполняется JavaScript процедура, которая считывает XML, который "по свистку" собирает код скетча.
Я понимаю, что это все происходит внутри одного кристалла, что если этого не делать, то кристалл все равно будет тупить бесконечный цикл ожидания, и еще непонятно что из этого лучше.
Короче, XML буду делать если другое ничего не получится.

По Websocket.
Код, указанный уважаемым Encrypt довольно сложный и делает очень много чего еще. Его явно писал специалист, делающий не первое устройство на ESP. Я попробовал его упростить для понимания, но вызовы серверных функций в нем так раскиданы по тексту, что я бросил это дело.

И, кажется, я нашел инструмент, которым можно это все сделать. ESPAsyncWebServer

Постараюсь отписаться по результатам.
Описываемая вами задача решается на BLE устройстве. Желательно с Mesh.
По кнопке BLE устройство пробуждается (1..2 мс типичный старт генераторов и PLL в чипе, при потреблении 1..5 мА на данной стадии).
Затем MCU смотрит это событие 'включения' или 'выключения' (короче разбирается что там случилось и зачем его пробудило) и передает маяк с выявленным состоянием (1..3 мс при 6..15 мА на данной стадии).
В этой-же стадии ловит сигнал подтверждения приема...
Всё - далее спит до изменения состояния кнопки (0.1 ..2 мкА на данной стадии, сильная зависимость от используемых элементов в цепи питания).
Далее в зависимости от нужд доставки данных (подтверждения передачи), которое зависит от типа сети - если это mesh, то узел сети (привязанный к устройству с кнопкой) сам разберется с необходимостью дублирования и прочими заморочками передачи сигнала до шлюза к потребителю...
У потребителя может стоять элементарное приложение PWA (всё умещается до 2-х страниц текста (пару десятков строк) с коментами на javascript).
При этом не нарушается ни одна спецификация (стандарты), в отличии от использования TCP/IP на устройствах типа ESP, которые не в состоянии по причине малых ресурсов удовлетворить и 1% стандартов TCP/IP.
 
Статья для несведующего вообще ни о чем, остальной интернет также пестрит "рекламой" PWA, но технической стороны не раскрывает... Создается впечатление, что это больше маркетинг, чем программироование (как минимум в настоящее время).
Правильно ли я понял, что в Google создаются некие API или инструменты, которые облегчают написание приложений, исполняемых браузерами? И, да, пока что, вроде бы, только на Chrome...
 

pvvx

Активный участник сообщества
Статья для несведующего вообще ни о чем, остальной интернет также пестрит "рекламой" PWA, но технической стороны не раскрывает... Создается впечатление, что это больше маркетинг, чем программироование (как минимум в настоящее время).
Правильно ли я понял, что в Google создаются некие API или инструменты, которые облегчают написание приложений, исполняемых браузерами? И, да, пока что, вроде бы, только на Chrome...
Для WEB BT/BLE не только на Chrome.
А про остальное у вас сложилось неверное мнение. Приложение берет местные ресурсы, внешние сервера не обязательны. С внешних серверов HTTPS берутся стартовые картинки, сама страница, *.js файлы. Положите их в местную файловую систему (или типа в кеш броузера) и всё будет работать.
О том что вам не разобраться и не найти примеров как всё это пишется, то тут беда рускоговорящей части. По законам у нас незя учиться новым вещам и технологиям - это не нужно управляющим...
--------
Для собственной сборки задачи ТС требуется (один из вариантов):
  1. Вот кнопка – TTP223 https://ru.aliexpress.com/af/TTP223.html?SearchText=TTP223&SortType=price_asc
  2. А это все необходимые мозги - https://ru.aliexpress.com/af/JDY%252d10.html?trafficChannel=af&SearchText=JDY-10&SortType=price_asc
  3. И батарейка на 3..3.6В - пусть CR2032.

Есть мелкое “Но”. Используемый MCU в режиме сна кушает:
  1. TTP223 – 1.5uA, maximum 3.0uA
  2. TLSR8266 – в режиме сна (ожидания события кнопки) 0.7uA, maximum в зависимости от активных включенных устройств – может вы хотите чтобы он пробуждаляс от активности на USB, UART, прочих таймерах – тогда к 10..100 uA.
  3. Кривой электролит/(дешевая керамика) с али в питании – 1..10 uA.
Итого, для реального приложения с кнопкой и нормально промытой(!) платой – 2..5 uA

Для устройства выполняющего контроль кнопки считать пиковые просыпания на 5 мс с пару пиками (< 30% времени активности) в 30 мА нет смысла – такое событие происходит до 10 раз в день? :)

У батарейки CR2032 емкость составляет примерно 210-240 мАч.

200/0.003=66666.66666 часов. 7 лет? Не – саморазряд батареи больше…
 

anthony3d

New member
Давно решено: Progressive Web Apps (PWA) - функционируют как нативные приложения.
Введение: PWA — это просто
Знаете, есть такой способ быстро узнать что перед тобой за книга: открыть на случайной странице и прочесть случайный абзац. В большинстве случаев это мгновенно дает нужное представление.
Вот, никогда не читал ничего из Мелвилла, даже не представляю о чем он писал.
Беру с полки книжку жены, открываю на случайной странице и читаю:
«В тот же день, едва стемнело и сменившиеся вахтенные спустились вниз, из кубрика послышался шум; двое предателей, трепеща, выбежали на палубу и осадили капитанскую каюту со словами, что они не осмеливаются оставаться вместе с остальными членами команды. Ни уговоры, ни пинки и затрещины не могли заставить их вернуться в кубрик; наконец, по их собственной просьбе, их поместили для сохранения их жизней в корабельный трюм.»
Вижу добротный, как моряцкая рубаха, текст о приключениях на воде, бунте экипажа. Глянув соседний абзац, я увидел иностранные имена (Мелвилл, как-никак :) и упоминание китов. Китобои. Когда захочу простой романтики — почитаю.

Захожу по указанной Вами ссылке. Вижу:
«Это проксирующий слой между фронтэндом и бэкэндом, находящийся в браузере. Все запросы браузера идут через него. Данное разделение на два независимых слоя позволило сделать переход обычного веб сайта в PWA максимально простым.»
Черт его знает!...

Короче, если вдруг озадачусь фронтендом и бэкендом до такой степени, что мне потребуется проксирующий слой, попробую.
Пока мне нужна кнопка.
И я ее сделал :)

(Извините, дружище, если задел Вас своими словами...)
 

pvvx

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

pvvx

Активный участник сообщества
Знаете, есть такой способ быстро узнать что перед тобой за книга: открыть на случайной странице и прочесть случайный абзац. В большинстве случаев это мгновенно дает нужное представление.
Восприятие only 'Бытовое кухонное'?
Чтобы в ESP появилось что-то, работающее по TCP/IP было затрачено не менее 1 года "первопроходцами".
Arduino вышла получив уже всё готовое.
(Извините, дружище, если задел Вас своими словами...)
Меня таким не задеть. Я знаю основной закон природы в этой сфере - толпа всегда выбирает худшее.
 

pvvx

Активный участник сообщества
Рассмотрите дальнейшее применение “сделанного”.

Пока аналогия такова:

Авто имеет четыре колеса. Если одно заменили на бревно/лом, впихнув между ступицей и аркой, то оно ещё может двигаться, даже разгоняется... Окружающим почему-то это не нравится – непонятно почему… Наверно описание плохое?

Меняем второе на дубину/лом… Оба ведущих – что-то не едет…
 
Сверху Снизу