• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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

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

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

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

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