Jump to content
iT4iT.CLUB

All Activity

This stream auto-updates     

  1. Past hour
  2. Большое спасибо, все заработало Еще вопросик если можно) php скриптом делаю json масив, но когда добавляю новый топик в скрипт массив ломается(индексы меняются) Подскажите пожалуйста как это исправить, предполагаю, что массив строится так в каком порядке расположены они в базе. Хотелось бы что бы они шли в столбик и при добавление нового топика он добавлялся в конец.
  3. Today
  4. Доброе время суток. Нет не сложно, это все правится через HTML и CSS. В код контроллера ничего вносить не потребуется. Но Вы точно столкнетесь с проблемой быстрой выгрузки фоновой картинки если она будет храниться на SPI Flash. Если она будет не большого размера, то все будет хорошо и не придется придумывать костыли, как я это делал с облаками. Скорее всего Вы не залили файлы web сервера в вашу новую flash память. Этот этап описан в инструкции.
  5. @emaus Доброе время суток. Давайте разбираться. В первую очередь нам нужно создать сертификаты. Я приведу пример с самоподписанным сертификатом, но в сети множество мануалов на эту тему, вплоть до получения сертификата у Let's Encrypt. СЕРВЕР Создание закрытого ключа для центра сертификации. Ключ будет защищен паролем. openssl genrsa -des3 -out ca.key 2048 Создание сертификата для центра сертификации openssl req -new -x509 -days 99999 -key ca.key -out ca.crt Создание закрытого ключа для брокера mosquitto openssl genrsa -out srv.key 2048 Создание запроса к центру сертификации по которому будет создан ключ сервера. Мы не задаем пароль для него т.к иначе придется его вводить каждый раз когда стартует mosquitto. И еще один важный момент, это заполнение поля "Common Name" в котором должно быть указано доменное имя сервера. Это необходимо для прохождения проверки подлинности на стороне клиента. Но если это невозможно, и Вы используете сервер в локальной сети, то эту проверку можно будет отключить на стороне клиента. Этот важный момент будет описан ниже. openssl req -new -out srv.csr -key srv.key Теперь осталось подписать сертификат сервера в нашем сервере сертификации. Потребуется ввести пароль которым защищен ключ сервера сертификации. openssl x509 -req -in srv.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out srv.crt -days 99999 Теперь необходимо установить MQTT брокер. Я использую операционную систему Linux Ubuntu 18.04 и буду описывать установку для неё. Все команды выполняются от пользователя root. apt-add-repository ppa:mosquitto-dev/mosquitto-ppa apt update apt install mosquitto Теперь созданы все необходимые файлы и каталоги и нам необходимо скопировать: сертификат центра сертификации (ca.crt), сертификат сервера (srv.crt) и ключ сервера (srv.key) в каталог который доступен mosquitto, например, /etc/mosquitto/certs По умолчанию конфигурационный файл сервера практически не содержит никаких настроек. Вот как он выглядит у меня. root@server:/# cat /etc/mosquitto/mosquitto.conf # Place your local configuration in /etc/mosquitto/conf.d/ # # A full description of the configuration file is at # /usr/share/doc/mosquitto/examples/mosquitto.conf.example pid_file /var/run/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d Как мы видим, сервер читает все пользовательские конфигурационные файлы из каталога /etc/mosquitto/conf.d тут мы и разместим свой файл. Создайте любой файл в этом каталоге, например, tls.conf touch /etc/mosquitto/conf.d/tls.conf Записываем в него следующие параметры. По необходимости добавьте свои параметры конфигурации. port 8883 cafile /etc/mosquitto/certs/ca.crt certfile /etc/mosquitto/certs/srv.crt keyfile /etc/mosquitto/certs/srv.key tls_version tlsv1.2 Я использовал версию TLS 1.2 т.к на момент тестирования модуль SSL для Python не знал о версии 1.3. Вероятнее всего эту ситуацию можно поправить, но я не стал тратить на это время т.к цель ставилась просто запустить скрипт с использованием шифрования соединения с сервером. Перезапустим сервер так systemctl restart mosquitto или по старинке /etc/init.d/mosquitto restart Проверяем, что сервер запустился и прослушивает порт 8883 netstat -plnt | grep mosquitto tcp 0 0 0.0.0.0:8883 0.0.0.0:* LISTEN 24233/mosquitto tcp6 0 0 :::8883 :::* LISTEN 24233/mosquitto Если что-то не так, то смотрим логи и анализируем ситуацию. СКРИПТ В первую очередь необходимо в самом начале файла добавить, по понятным причинам, модуль SSL. import ssl Вносим изменения в переменные описывающие где искать MQTT сервер и меняем порт. mqtt_port = 8883 Чтобы Вам не насиловать себя правками моего кода в Python, я сразу предоставлю Вам всю функцию start() в которой я добавил поддержку шифрования и вывода отладочной информации в случае возникновения проблем. Просто замените имеющийся код этой функции на предоставленный мною в этом посте. def start(): global mqttReconnect global mysql try: mysql = mysqlDB(mysql_host, mysql_user, mysql_passwd, mysql_schema, mysql_port) mqttc = mqtt.Client(mqtt_client_id, True) # mqttc.on_log = on_log mqttc.on_connect = on_connect mqttc.on_disconnect = on_disconnect mqttc.on_message = on_message # !!!DANGEROUS!!! Be sure to remove "cert_reqs=ssl.CERT_NONE" if you use valid domain names in the COMMON NAME field of your certificate! mqttc.tls_set("/etc/mosquitto/certs/ca.crt", cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLSv1_2); if len(mqtt_login) > 0: mqttc.username_pw_set(mqtt_login, mqtt_password) mqttReconnect = True while mqttReconnect: try: alert('connecting to MQTT broker...') mqttc.connect(mqtt_server, mqtt_port, 60) mqttReconnect = False except Exception as e: alert('could not connect to MQTT broker, reconnect after 10 seconds: ' + str(e), True) time.sleep(10) while not mqttReconnect: mysql.loop() mqttc.loop(timeout=1.0) except Exception as e: alert('\nunexpected termination of the program: ' + str(e), True) Обратите внимание на следующую строку mqttc.tls_set("/etc/mosquitto/certs/ca.crt", cert_reqs=ssl.CERT_NONE, tls_version=ssl.PROTOCOL_TLSv1_2); Тут мы указываем где найти сертификат центра сертификации, по нему будет проверяться подлинность сертификата сервера. Также мы указываем версию TLS и, что !!!ОЧЕНЬ ВАЖНО!!! - мы говорим клиенту не проверять подлинность сертификата (cert_reqs=ssl.CERT_NONE). Это нужно только на время отладки или в том случае если поле "COMMON NAME", сертификата сервера, не соответствует фактическому адресу сервера или там указан только ip адрес. Я оставил об этом соответствующий комментарий строкой выше. # !!!DANGEROUS!!! Be sure to remove "cert_reqs=ssl.CERT_NONE" if you use valid domain names in the COMMON NAME field of your certificate! Осталось самое главное - проверить работоспособность. Запустите демона с параметром window чтобы увидеть дополнительную информацию и ошибки в ходе отладки <script dir>/mqttMySqlClient.py window Все должно заработать, проверил на своем домашнем сервере.
  6. Last week
  7. установил 8 мб, скетчи работают, а вот метеостанцию запустить не удалось, похоже какая то проблема с SPIFFS так как светодиод моргает, в монитор инфу пишет, точку доступа создает, к ней подключаюсь и все, в браузере ничего
  8. Что-то не могу понять(наверно я не то делаю) пытаюсь запустить скрипт с шифрованием но не выходит. Вот что сделал, просто добавил это ниже записи mqttc.connect(mqtt_server, mqtt_port, 60) mqttc.tls_set(ca_certs="mqtt.host.ru.pem", certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED, tls_version=ssl.PROTOCOL_TLSv1_2, ciphers=None) Сертификат генерировал таким способом echo -n | openssl s_client -connect mqtt.host.ru:8883 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mqtt.host.ru.pem Подскажите что не так я дела(скорей всего все) -- Я думаю будет востребовано обратный процесс, к примеру дергать релешки через веб браузер или приложение :)
  9. разобрался с RSSI, оказывается смотрел ее не подключившись к роутеру, то есть не настроив имя и пароль для подключения к роутеру...
  10. сейчас посмотрел разметку в файле eagle.flash.4m3m.ld и возможно понял почему RSSI, вроде бя я стирал не только скетч но и всю память ESP, а там похоже хранятся какие то настройки... по разметке получается для скетча всегда оставляется 1 мегабайт, остальное под SPIFFS или вообще пусто
  11. код вроде на месте, сам кружок RSSI есть , но показывает 0, а шкала круга на максимуме причем для проверки скачал архив с форума , раскомментировал RSSI и все равно 0, возможно что-то настройками IDE намудрил, буду пробовать проверять перепайка была в первую очередь интересна чтобы запустить станцию на ESP01, ESP01 и датчик BME280 получается метеостанция очень небольшого небольшого размера, но довольно функциональная если памяти будет больше, то можно в вэб интерфейс выводить больше различной информации, даже видеоролик какой нибудь можно вывести или фото , хотя это наверное актуально для яesp32 например вид города, фотографию сложно прикрутить? или сделать типа скринсейвера, чтобы фото менялись, главное чтобы сильно браузер не нагружало
  12. Я впаивал в ESP память и 8 и 16 МБ и соответственно менял конфигурации а Arduini IDE - никакого смысла в этом нет, работает совершенно так же , как и с 4 МБ. И начальная загрузка дольше, особенно с 8 МБ. И на большом количестве датчиков точно также перестает строить тренды.
  13. @emaus доброе время суток. В данном примере нет, но функционал шифрования добавляется с помощью метода tls_set с соответствующими параметрами. Посмотреть их можно тут https://www.eclipse.org/paho/clients/python/docs/ К сожалению, это проблематично т.к единственный способ оперативно отслеживать изменения в СУБД это триггеры и по умолчанию они не позволяют вызывать внешние программы в самой ОС а только лишь исполняют код в пределах самой СУБД т.к это противоречит политике безопасности. Но сделать это возможно. Но гораздо более простой вариант, это отправлять сообщение в нужную ветку на брокер в той программе которая должна была вносить изменения в БД. Это не противоречит политике безопасности и гораздо проще чем компилировать собственные модули для СУБД. Или есть медленный вариант, это свой собственный механизм отслеживания изменений, когда демон периодически опрашивает таблицу в БД, находит изменения и уже потом отправляет изменения на брокер. Но этот метод будет иметь задержку равную периоду опроса БД и потребует строгого соблюдения правил обновления данных в таблице сторонними скриптами. Например, может потребоваться указывать признак обновления для определения статуса записи, по которому демон будет находить изменения, не копаясь во всех записях. Или для обновления записей должны будут использоваться только пользовательские функции, реализующие механизм идентификации записей. В общем, над этим можно подумать, но на сколько это будет востребовано...
  14. @Neon доброе время суток. Да, это более современный контроллер и гораздо более производительный. Возможно Вы удалили код данного сенсора или используете другой пользовательский модуль, в котором его нет. Вот его код sensors.add(new knob_t(-100, 0, "1", "RSSI", "dbm"), device::in, "rssi",[&](){ return wifi.isConnected() ? WiFi.RSSI() : 0; }); Хороший опыт, рад, что у Вас все получилось) Выбираемые параметры разметки flash памяти в Arduino IDE зависят для конкретных плат, описанных в файле boards.txt для ESP8266 и отмеченных параметром flash_ld. Сами ld файлы располагаются в каталоге по относительному пути \hardware\esp8266\2.5.2\tools\sdk\ld и зависят от версии пакета ESP8266 (в примере 2.5.2) и от того используете Вы или нет Portable версию Arduino IDE. Для данного проекта я рекомендовал использовать контроллер с 4Mb Flash и разбивать её по схеме описанной в файле eagle.flash.4m3m.ld. А тут можно посмотреть их содержимое не копаясь в самой среде на своем компьютере https://github.com/esp8266/Arduino/tree/master/tools/sdk/ld В общем это очень интересная тема, но требует внимательности и не прощает ошибок.
  15. Обратил внимание , что в Ардуино IDE при в плате esp можно выбрать 8 и 16 мегабайт
  16. А у esp32 есть какие то функции отсутствующие в esp8266? У меня почему-то исчез вывод показаний RSSI, это произошло после нескольких перепрошивок esp, теперь при прошивке даже разных esp все равно не выводит... поэтому то и скачивал заново прошивку, думал может я что-то изменил и не заметил Кстати, запустил метеостанцию на esp01 :) Поставил на нее 4 МБ и датчик BME280
  17. @Neon доброе время суток. Да действительно, Вы правы, файлы были обновлены, но этой ошибки там нет. Все дело в обновлении среды разработки и пакета ESP8266. Теперь можно использовать Arduino IDE v1.8.10 с поддержкой ESP8266 v2.5.2. И как раз в последних версиях пакета ESP8266 были переименованы некоторые функции и responseCodeToString теперь имеет имя без нижнего подчеркивания. Я постарался чтобы проект поддерживал одну из последних версий пакета. Также я выложил некоторые дополнительные наработки которые накопились у меня во время работы над ответами некоторым пользователям в этой теме. Теперь можно подсмотреть как добавит датчики DS18B20 или самодельный анемометр с импульсным выходом. Все это делается в связи с подготовкой к публикации ряда видео роликов о том, как разобраться в том, что я понаписал. Все же проект уже старый, а вопросы у заинтересованных людей еще возникают, хотя почти все ответы есть в теме на форуме. После публикации видео, тему можно будет считать закрытой и полноценно перейти к ESP32.
  18. Kitsum здравствуйте, вы похоже недавно корректировали файлы и забыли в файле webserver.h в строке String codeTranslate(int code) { return ESP8266WebServer::_responseCodeToString(code); } подчеркивание перед responseCodeToString(code);
  19. красиво, но похоже ресурсоемко, у меня в брауезере притормаживает...
  20. Earlier
  21. Добрый день. Скрипт я так понял не поддерживает mqtt работающий с SSL сертификатами ? И планируете ли Вы добавить в скрипт что бы он работал в обратном порядке ?
  22. @Вадим Спасибо за ссылку. Метеостанция интересна, но меня больше заинтересовал плагин реализующий датчики. Как оказалось, он довольно стар и уже претерпел не мало изменений. Вот интересные ссылки по этой теме: Плагин https://github.com/HanSolo/SteelSeries-Canvas Вариант использования плагина нашим, по все видимости Испанским, коллегой http://montbaumeteo.com/dades/gauges-ss-basic.htm Вероятнее всего я постараюсь использовать данный плагин на ESP32.
  23. http://vozmeteo.com.ua/index.php Похожий интересный проект. И графики прикольные. Только кода нет.
  24. Доброе время суток. @Stefan Это очень странное поведение. Если есть возможность, то попробуйте подключиться к контроллеру с "левых" устройств, не в ходящих в Ваше домашнее окружение. Проверьте как работает тестовый скетч для режима STA и подключитесь в качестве клиента к Вашей домашней сети или опишите в программе метеостанции к чему подключаться контроллеру. В основном файле программы есть такие строки: conf.add("client_ssid"); conf.add("client_pass"); conf.add("client_bmac"); Первые два параметра отвечают за имя домашней WiFi сети и пароль, последний за MAC адрес и требуется если сеть скрыта, в противном случае его заполнять не обязательно. conf.add("client_ssid", "имя сети"); conf.add("client_pass", "пароль от сети"); conf.add("client_bmac", "MAC можно не указывать"); Также есть вероятность, что Ваши устройства не могут работать в едином стандарте с AP микроконтроллера. Если память не подводит, то контроллер должен использовать 802.11n. Попробуйте пока так поэкспериментировать. @IvAn Я не буду давать Вам советы в реализации кода для данного проекта т.к мой код сам нуждается в переработке, но опишу своё видение. Проверяйте состояние соединения как со стороны микроконтроллера, так и со стороны MQTT клиента Подключаемся к серверу только при наличии подключения к точке доступа Если восстанавливаем соединение, то не забываем восстановить подписки Публикуем сообщения только если отработал п.1 Я думаю, и это только мое личное мнение, что функция "callback" не должна заниматься обработкой команд. Её цель - принять и понять, что нужно сделать, а дальше сообщить об этом основному коду. Вдруг вы будите получать сообщения со скоростью пулеметной очереди... Не знаю, будет ли Вам полезно, но посмотрите на этот код https://it4it.club/files/file/8-prostoy-dvuhkanalnyy-schetchik-vody-na-esp8266/ Обратите внимание, что в данном проекте, html код бесполезен без jQuery. Именно в последнем кроется логина обработки всех событий, в том числе и появление меню. Я опишу, на что Вам стоит обратить внимание. В файле index.htm есть такой кусочек разметки, он отвечает за меню <div class="menu"> <div id="sensors" class="list1"></div> <div id="graph"></div> <div id="settings"></div> </div> Как мы видим, имеется объект с идентификатором settings, который отображает нам иконку настроек. Этому объекту соответствует небольшой кусочек кода в css. описанный чуть выше и говорящий браузеру сформировать фон объекта в виде изображения. .menu #settings { background-image: url('data:image/png;base64, ... '); } Часть кода элемента я скрыл т.к он представляет из себя строку закодированную в base64 формате, а оригинал строки является бинарным файлов. Это сделано, чтобы не хранить изображение отдельно в flash памяти и загрузить его вместе с загрузкой файла index.htm. Это уловка чтобы получить большую производительность в работе web интерфейса данного проекта т.к браузер загружает разные файлы в отдельных потоках, а контроллер не способен отдавать параллельно несколько файлов. Из-за этого мы отдаем все критически нужное в одном потоке. Конечно есть механизмы решающие и эти задачи, но я пришел к ним уже на контроллере esp32. Теперь, когда у нас есть кнопка и ее оформление, можно вешать на неё события. В нашем случае это событие клика мышью и реализовано через библиотеку jQuery. Ищем следующий код. $("#settings").click(function() { /* ... */ }); Содержимое нас не сильно интересует т.к начиная с этого этапа нам необходимо реализовывать свою логику. По сути, самый простой вариант, это отобразить заранее подготовленное меню, но находящееся в скрытом состоянии. Например, опять наше меню настроек. Оно скрыто из-за параметра hidden, но это не единственный способ. <div class="settings" hidden> <!-- ... --> </div> Для этого в описанную ране функцию click можно добавить следующий код $(".settings").show(); Конечно, все это очень поверхностно, но теперь вы хотя бы имеете представление как работает текущий код и в какую сторону копать. Если Вы решите углубиться в этом направлении интерфейса, то обратите внимание на безопасность. В текущем проекте, все узкие места прикрыты авторизацией на стороне микроконтроллера т.к код web интерфейса легко посмотреть и изменить. Чтобы отдать управляющую команду или получить информацию от контроллера нужно быть авторизованным пользователем.
  25. Здравствуйте! Ваш проект лучший для изучения. Но есть несколько вопросов. mqtt работает только на отправку. Как лучше реализовать и прием? И не хватило знаний как в index.htm добавить еще одно меню без пароля. Пока сделал так. /* Инициализация GPIO для управления внешней нагрузкой */ gpio_12(); // Простое превышение температуры (выставляется в WEB интерфейсе) // gpio_13(); // Простое превышение влажности (выставляется в WEB интерфейсе) // gpio_14(); // Расхождение расчетной абсолютной влажности между показаниями с двух датчиков, например, BME280 /* Добавление в планировщик заданий по отправке данных на внешнии ресурсы */ cron.add(cron::time_1m, sendDataToMQTT); // Отправка данных MQTT брокеру cron.add(cron::time_5m, sendDataToThingSpeak); // Отправка данных на сервер "ThingSpeak" cron.add(cron::time_5m + cron::minute, sendDataToNarodmon); // Отправка данных на севрер "Народный мониторинг" /* Добавление в планировщик заданий по контролю датчиков (холодный старт) */ sensors.checkLine(); // один раз // cron.add(cron::time_12h, [&](){ sensors.checkLine(); }, true); // Проверка шины и инициализация датчиков при необходимости cron.add(cron::time_5s, [&](){ sensors.dataUpdate(); }, true); // Сбор данных с датчиков /* Добавление в планировщик задания (горячий старт) */ cron.add(cron::time_10m, [&](){ sensors.logUpdate(); }, "httpSensorsLog"); // Обновление журнала (httpSensorsLog - не обязательный уникальный ID для быстрого поиска задания другими программными модулями) // получение данных по mqtt mqttAPI.setCallback(callback); } void loop() { /* Обработчики */ wifi.handleEvents(); http.handleClient(); cron.handleEvents(); if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) { mqttAPI.loop(); } } И в services #ifndef SERVICES_H #define SERVICES_H #include <PubSubClient.h> #include <ESP8266HTTPClient.h> #include "webserver.h" WiFiClient wifiClient; PubSubClient mqttAPI(wifiClient); String httpCodeStr(int code) { switch(code) { case -1: return "CONNECTION REFUSED"; case -2: return "SEND HEADER FAILED"; case -3: return "SEND PAYLOAD FAILED"; case -4: return "NOT CONNECTED"; case -5: return "CONNECTION LOST"; case -6: return "NO STREAM"; case -7: return "NO HTTP SERVER"; case -8: return "TOO LESS RAM"; case -9: return "ENCODING"; case -10: return "STREAM WRITE"; case -11: return "READ TIMEOUT"; default: return http.codeTranslate(code); } } String mqttCodeStr(int code) { switch (code) { case -4: return "CONNECTION TIMEOUT"; case -3: return "CONNECTION LOST"; case -2: return "CONNECT FAILED"; case -1: return "MQTT DISCONNECTED"; case 0: return "CONNECTED"; case 1: return "CONNECT BAD PROTOCOL"; case 2: return "CONNECT BAD CLIENT ID"; case 3: return "CONNECT UNAVAILABLE"; case 4: return "CONNECT BAD CREDENTIALS"; case 5: return "CONNECT UNAUTHORIZED"; default: return String(code); } } bool mqttPublish(String topic, String data) { yield(); if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic; return mqttAPI.publish(topic.c_str(), data.c_str(), true); } bool mqttPublish(String topic, float data) { return mqttPublish(topic, String(data)); } bool mqttPublish(String topic, int32_t data) { return mqttPublish(topic, String(data)); } bool mqttPublish(String topic, uint32_t data) { return mqttPublish(topic, String(data)); } bool mqttSubscribe(String topic) { yield(); if (conf.param("mqtt_path").length()) topic = conf.param("mqtt_path") + "/" + topic; return mqttAPI.subscribe(topic.c_str()); } void restAPIsend(String host, uint16_t port, String query) { HTTPClient restAPI; restAPI.setUserAgent("weather station " + WiFi.hostname()); restAPI.setTimeout(3000); restAPI.begin(host, port, query); int code = restAPI.GET(); #ifdef console console.printf("answer: %s\n", httpCodeStr(code).c_str()); #endif restAPI.end(); yield(); } /* mqtt.it4it.club */ void callback(char* topic, byte* payload, unsigned int length) { String Tmsg = ""; for (int i = 0; i < length; i++) { Tmsg = Tmsg+(char)payload[i]; } #ifdef console console.print("Message arrived ["); console.print(topic); console.print("/"); console.print(Tmsg); console.println("]"); #endif if (topic = "Meteo/tgaz") { conf.param("gpio12", Tmsg); #ifdef console console.println(conf.param("gpio12")); #endif } } /* mqtt.it4it.club */ void reconnect() { if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) { // баг при прямой передаче значения (c_str) из конфига в setServer (не забыть поправить!) String server = conf.param("mqtt_server"); int port = conf.param("mqtt_port").toInt(); mqttAPI.setServer(server.c_str(), port); mqttAPI.connect(WiFi.hostname().c_str(), (conf.param("mqtt_login").length() ? conf.param("mqtt_login").c_str() : 0), (conf.param("mqtt_pass").length() ? conf.param("mqtt_pass").c_str() : 0) ); if (mqttAPI.connected()) { #ifdef console console.println(F("services: send data to MQTT server")); #endif mqttSubscribe("tgaz"); mqttPublish("t_need", conf.param("gpio12")); mqttPublish("temperature", sensors.get("out_temperature")); mqttPublish("humidity", sensors.get("out_humidity")); mqttPublish("pressure", sensors.get("out_pressure")); mqttPublish("co2", sensors.get("out_co2")); } else { #ifdef console console.printf("answer: %s\n", mqttCodeStr(mqttAPI.state()).c_str()); #endif } } } void sendDataToMQTT() { if (wifi.transferDataPossible() and conf.param("mqtt_server").length()) { if (mqttAPI.connected()) { #ifdef console console.println(F("services: send data to MQTT server")); #endif mqttPublish("t_need", conf.param("gpio12")); mqttPublish("temperature", sensors.get("out_temperature")); mqttPublish("humidity", sensors.get("out_humidity")); mqttPublish("pressure", sensors.get("out_pressure")); mqttPublish("co2", sensors.get("out_co2")); } else { reconnect(); #ifdef console #endif } } } /* https://thingspeak.com/ */ void sendDataToThingSpeak() { if (wifi.transferDataPossible() and conf.param("thingspeak_key").length()) { #ifdef console console.println(F("services: send data to ThingSpeak")); #endif String query; query += "&field1=" + String(sensors.get("out_light")); query += "&field2=" + String(sensors.get("out_temperature")); query += "&field3=" + String(sensors.get("out_humidity")); query += "&field4=" + String(sensors.get("out_pressure")); query += "&field5=" + String(sensors.get("out_co2")); restAPIsend("api.thingspeak.com", 80, "/update?api_key=" + conf.param("thingspeak_key") + query); } } /* https://narodmon.ru/ */ void sendDataToNarodmon() { if (wifi.transferDataPossible() and conf.param("narodmon_id").length()) { #ifdef console console.println(F("services: send data to Narodmon")); #endif String query; query += "&L1=" + String(sensors.get("out_light")); query += "&T1=" + String(sensors.get("out_temperature")); query += "&H1=" + String(sensors.get("out_humidity")); query += "&P1=" + String(sensors.get("out_pressure")); query += "&CO2=" + String(sensors.get("out_co2")); // query += "&H2=" + String(sensors.get("out_absoluteHumidity")); restAPIsend("narodmon.ru", 80, "/get?id=" + conf.param("narodmon_id") + query); } } #endif
  26. Доброго времени суток всем, повторил проект прошил и залил файлы на ESP, помогите советом что предпринять если точка доступа есть, а подключиться не удается ни на компе ни на смартфоне. Демоверсия скетча AP из примеров ведет себя также не объяснимо пишет пароль неверен, смутные подозрения что то связано с шифрованием, но опыта почти нет....
  27. верно , смысла особого возится с памятью более 4 Мб нет, наверное это больше имеет смысл в esp1, там обычно 1 Мб, если нужна компактность и не нужно много GPIO мне esp07 пришла тоже с 1 Мб, брал ее так как у нее есть разьем для антенны
  28. Необходимо заменить саму микросхему памяти и в настройках среды разработки выставить размер flash и разметку. В Arduino IDE это делает в настройках выбора платы. Выгоднее всего покупать уже готовые модули с 4Мб памяти т.к по цене они точно такие же как и с 1 Мб. В теории можно поставить и 8Мб, но придется вносить изменения в конфигурационные файлы среды разработки. Я думаю, что львиную часть задач можно решить с 4Мб памяти. Конечно все это влияет на производительность, но еще больше на производительность влияет сам код и тут речь не только о пользовательских реализациях, но и коде самой Arduino платформы. Например, в 160МГц не будет никакого смысла если код изобилует вызовами delay, тоже самое относится к памяти, весь прирост скорости может упереться в режим dout, выставленный случайно место qio. В общем правильный ответ будет ДА, это может повысить производительность, НО только в купе с оптимизированным, хотя бы в приделах Arduino, кодом.
  29. Доброе время суток. Думаю, что Вы все сделали правильно, по крайней мере в контексте данного проекта. Другой вопрос, на сколько сам проект корректно написан... Датчик освещенности берите исходя из потребности. не думаю. что будут сложности с добавлением любого из них. Лично я люблю датчики, имеющие I2C интерфейс, но это мои личные предпочтения. Что касаемо изменения интерфейса в зависимости от внешних факторов. Сразу отвечу. что это возможно. но Вам придется разобраться с CSS. На данный момент все стили анимации, о которой Вы говорите описаны в файле cloud.css, он подгружается java скриптом после загрузки страницы. Забегая вперед скажу. что такой механизм загрузки связан с ограниченной производительностью контроллера и тем, что он отдает файлы web интерфейса в один поток. Также в этом файле находятся все изображения облаков и луны в специальном формате base64. После загрузки этого файла, стили, описанные в нем, добавляются к основному стилю, описанному в файле index.htm. После этой операции стили могут быть применены к объектам HTML. Анимация цвета фона описывается классом .sky .sky { background: #007fd5; -webkit-animation: sky_background 50s ease-out infinite; -moz-animation: sky_background 50s ease-out infinite; -o-animation: sky_background 50s ease-out infinite; -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); } Тут описан начальный цвет фона и все трансформации. Обратите внимание, что некоторые стили в разных движках браузеров описываются по-разному. В коде видно. что анимацией занимается объект sky_background @-webkit-keyframes sky_background { 0% { background: #007fd5; color: #007fd5 } 50% { background: #000; color: #a3d9ff } 100% { background: #007fd5; color: #007fd5 } } @-moz-keyframes sky_background { 0% { background: #007fd5; color: #007fd5 } 50% { background: #000; color: #a3d9ff } 100% { background: #007fd5; color: #007fd5 } } На этом описание смены цвета фона заканчивается. В вашем случае, эту анимацию можно удалять, а у объекта body просто менять background в зависимости от показаний датчика освещенности. Для этого придется придумать формулу или массив описывающий зависимость цвета от показаний. Данные с сенсоров читает java функция, описанная в index.htm function chenge(fast) { if(allowAjaxConnection || fast) { $.ajax({ dataType: "json", url: domain + "api/sensors" + ($(".settings #sl-system").is(":visible") ? "?system=true" : ""), type: "GET", cache: false, timeout: 3000, success: function(data) { $.each(data, function(name, value) { if (name !== 'system') animate("." + name, value); }); if (data.system) apiSetSystemInfo(data.system, true); //$('.out_temperature').trigger('configure', {"fgColor":"#FF0000"}); } }); } setTimeout(chenge, 5000); } Переменная name содержит имя сенсора, а переменная value значение. Останется только добавить условие проверки имени и связать значение с цветом фона. Луна описана в CSS классом moon, а в коде включается с помощью строки $(".moon").show(); Но Вам лучше использовать более плавные анимации.
  1. Load more activity
×
×
  • Create New...