Часы на NodeMCU Lua + MAX7219 минус все лишнее.

Тема в разделе "Глядите, что я сделал", создана пользователем ИгорьК, 4 сен 2018.

Метки:
  1. Catbear

    Catbear Гик

    Добрый день, Игорь! Пару лет назад повторил Ваши часы, очень понравился необходимый лаконичный функционал. Все это время работало круглосуточно и отлично, успело покрыться пылью:). Ключ с сервиса более нигде не использовал точно. Но на прошлой неделе, единственное, перестало работать отображение погоды, все остальное работает. Хотел уточнить: общая ли это проблема с сервисом ввиду каких то изменений, или это только у меня? Столкнулись ли вы с подобным?
     
  2. Voik

    Voik Гик

    Приветствую!
    У меня такая же ситуация. Надо, видимо, на другой погодный сервис переехать.
     
    Catbear нравится это.
  3. Catbear

    Catbear Гик

    Спасибо за информацию! А то я просто в недоумении был, думал, может провайдер чудит. Так как "ломаться" в конструкции просто нечему.
     
    Voik нравится это.
  4. ИгорьК

    ИгорьК Гуру

    Да, коллеги! Часы начали гнать чушь.

    О проблеме с народным мониторингом писал раньше, в одних часах, что делал для товарища ее исправил, часы отдал а код куда-то потерял :) Даже у меня фигня сейчас.

    Что касается прогноза погоды - там тоже что-то произошло. Надо выделять время и разбираться.
    А времени пока катастрофически нет. Даже не сориентирую когда займусь :-(
     
    Voik, Catbear и mikhail09p нравится это.
  5. Catbear

    Catbear Гик

    Понятно теперь, спасибо за информацию и быстрый ответ!
     
  6. ИгорьК

    ИгорьК Гуру

    Для исправления проблемы ограничения народного мониторинга на одновременный запрос данных с нескольких датчиков заменяем файл "_narodask.lua" на следующий:



    Код (Lua):
    local uuid = "ВАШ UUID"

    local api_key= "ВАШ api_key"

    local sens = {26681,32191,81356,85254,40239} -- Датчики перечислить таким образом



    if not dat then dat = {} dat.pnarod = 0 end

    if not dat.pnarod then dat.pnarod = 0 end



    if not uuid or uuid == 'UUID' then

        return

    else

    local parce = function(con, c)

        _G.c = c

        con = nil

        srv = nil

        parce = nil

        return (function() dofile'narodparce.lua' end)()

    end

    dat.pnarod = dat.pnarod >= #sens and 1 or dat.pnarod + 1

    print('dat.pnarod = ', dat.pnarod)

    print('ask sensor', sens[dat.pnarod])



    srv = net.createConnection(net.TCP, 0)

    srv:on("receive", parce)

    srv:on("connection", function(sck, c)

            sck:send("GET /api/sensorsValues?sensors="..sens[dat.pnarod].."&uuid="..uuid.."&api_key="..api_key.."&lang=en HTTP/1.1\r\nUser-Agent: Mozilla/5.0\r\nHost: narodmon.ru\r\nConnection: close\r\n\r\n")

        end)

    srv:connect(80,"narodmon.ru")

    end
    Количество датчиков теперь - сколько хотите.

    Погодный сервер не отвечает, здесь времени надо больше чтобы понять причину.
     
    Последнее редактирование: 6 дек 2022
    Voik нравится это.
  7. ИгорьК

    ИгорьК Гуру

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

    upload_2022-12-6_13-11-51.png
     
  8. Voik

    Voik Гик

    Сегодня часы отобразили данные с погодного сервиса. Для этого я зашёл в личный кабинет этого самого сервиса и всё.
     
  9. Catbear

    Catbear Гик

    Ну у меня так просто не проканало. Поменяли они количество бесплатных запросов :-(. Теперь на Free:
    Calls per day 50. https://www.weatherbit.io/pricing. А было 250??? Так что, видимо в текущем виде, часы "перелимичивают" Free план. Теперь либо переползать на иной сервис (как выше упомянут), либо править количество запросов к серваку в текущем коде до приемлемого для Free уровня (чтоб не блочило). UPD: После визита в личный кабинет, все же стало показывать погоду. Надолго ли, не знаю, так как использование API под 100% отображало.
     
    Последнее редактирование: 11 дек 2022
  10. ИгорьК

    ИгорьК Гуру

    Да, раньше было явно побольше.
    Сейчас часы явно перекрывают лимит.

    А есть наметки на новый сервис? Чёт я не знаю уже куда идти.
     
  11. Catbear

    Catbear Гик

    Лично для меня народмон может быть, датчик висит за окном. Вы про него и писали выше. А так, может ещё openweathermap?
     
    Последнее редактирование: 11 дек 2022
    ИгорьК нравится это.
  12. Voik

    Voik Гик

    rp5.ru мне нравится.

    Ещё пользую https://wttr.in/ (помощь: https://wttr.in/:help)
    Но бывает, что очень много запросов и не отображает погоду.
     
    Последнее редактирование: 11 дек 2022
    ИгорьК нравится это.
  13. ИгорьК

    ИгорьК Гуру

    Интересные сайты, но оба не годятся. Сайт должен иметь API для запроса прогноза погоды и раскрывать все возможные варианты ответов. Оба его не имеют.

    rp5.ru не заточен на выдачу кратких ответов, https://wttr.in/ позволяет более менее кратко получить данные, но в силу отсутствия API нет заранее известных возможных ответов. (Также способ выдачи данных возможно не позволит их распарсить.) Концепция этих часов - увидеть все на одном экране. Все возможные ответы сервера погоды разложены в таблицу того что будет показано на дисплее.

    Остается openweathermap. Что-то с ним было не так. Но точно вспомнить не могу.

    По памяти, на разборки с сервером требовалась неделя активной работы, чтобы все постоянно держать в голове. Пока не могу выделить столько времени, к сожалению. Возможно внесу изменения в количество запросов. 50 в сутки - это по одной паре запросов в час: погода сейчас/прогноз погоды. Сегодня с утра часы тоже показали прогноз, но к вечеру его не будет. В общем, постараюсь...
     
  14. ИгорьК

    ИгорьК Гуру

    Получаем текущую погоду с openweathermap:

    Код (Lua):
    local key = "key"
    local city = "Moscow"
    print('city:'..city)

    if not key or key == 'key' then return end

    if m then m:close(); m = nil; dat.broker= false end
    if not dat then dat = {} end
    if not wth then wth = {} end

    local conn, killask

    local _skip_hd = true
    local _chk = ''
    local tempnow

    local request = "GET http://api.openweathermap.org/data/2.5/weather?q="..city.."&mode=xml&units=metric&appid="..key.." HTTP/1.1\r\n" ..
    "Host: api.openweathermap.org\r\n"


    local function cb_disconnected(c)
     
        local status, err = pcall(function() conn:close() end)
        print('status, err', status, err)
        c, conn = nil, nil
        print('disconnected')
        if not tempnow then
            print('Lost answer!')
        end
        if file.exists('mqttset.lua') then dofile'mqttset.lua' end
    end

    local function data_received(c, data)
        if killask then killask:stop(); killask:unregister(); killask = nil end

        if _skip_hd then
            _chk = _chk..data
            local i, j = string.find(_chk, '?>')
            if i then
                _skip_hd = false
                data = string.sub(_chk, j + 1, -1)
                _chk = nil
            end
        end

        if not _skip_hd then
            tempnow = string.match(data, 'temperature value="(%p*%d+.?%d?%d?)' )
            local tempmin = string.match(data, 'min="(%p*%d+.?%d?%d?)' )
            local tempmax = string.match(data, 'max="(%p*%d+.?%d?%d?)' )

            print('tempmow', tempnow)
            print('tempmin', tempmin)
            print('tempmax', tempmax)
            wth.tserver = tempnow
            cb_disconnected(c)
        end
    end


    if wifi.sta.status() == 5 then
        net.dns.resolve("api.openweathermap.org", function(sk, ip)
            if (ip == nil) then
                print("Lost DNS openweathermap!")
            else
                killask = tmr.create()
                killask:alarm(10000, 0, function(_)
                    if conn then
                        cb_disconnected()
                        print('\n\nConn killed!\n\n')
                    end
                end)
             
                conn = net.createConnection(net.TCP, 0)
                conn:on("connection", function(conn, payload) conn:send(request.."Connection: close\r\nAccept: /\r\n\r\n") end)
                conn:on("disconnection", cb_disconnected)
                conn:on("receive", data_received)
                conn:connect(80, 'api.openweathermap.org')
            end
        end)
    end

    Получаем ключик openweathermap, вносим в этот файл. Файл обзываем "_askwbitnow.lua" и подменяем существующий. Файл можно запускать отдельно от всей программы для проверки:

    upload_2022-12-12_15-24-50.png


    С прогнозом погоды возни больше. Для бесплатной версии доступен отчет "3-hour Forecast 5 days" - это пипец сколько данных и их надо как-то парсить.

    P.S. Это изменение снижает запросы к weatherbit ровно в два раза.
     
    Последнее редактирование: 13 дек 2022
    Catbear и Voik нравится это.
  15. ИгорьК

    ИгорьК Гуру

    @Voik , @Catbear! Заинтересованные коллеги! Надо потестировать два файла добычи информации с openweathermap для перевода часов на этот сервер.

    В прошивке должны присутствовать модули: rtcmem,rtctime,sntp
    upload_2022-12-14_13-26-37.png
    В приложении два файла. Распакуйте, посмотрите в начало, исправьте ваши данные - ключ, местность, и временная зона где есть.

    Вручную запустите "sntp.sync()". Это же запускается и в одном из файлов, но поскольку оно асинхронно, в первый запуск файла "_getdayandnight.lua" время может отличаться.

    upload_2022-12-14_13-35-36.png

    Каждый файл запускается самостоятельно. Картина будет такой:

    upload_2022-12-14_13-32-46.png

    Пожалуйста, посмотрите как это работает в разное время суток. В первую очередь интересует _getdayandnight.lua
     

    Вложения:

    • openweather.zip
      Размер файла:
      2,1 КБ
      Просмотров:
      62
    Последнее редактирование: 14 дек 2022
    Catbear нравится это.
  16. Catbear

    Catbear Гик

    Надо еще новую прошивку такую создать, так как на предыдущей не было rtcmem,rtctime,sntp элементов?
     

    Вложения:

    ИгорьК нравится это.
  17. ИгорьК

    ИгорьК Гуру

    На предыдущей они есть 100%, без них часы не работали бы. Rtcmem в данном случае не нужно, ошибся. Только rtctime и sntp.
     
  18. Voik

    Voik Гик

    Уважаемый, обязательно протестирую при первой возможности. Думаю , что к концу недели будет.
     
  19. Catbear

    Catbear Гик

    Постараюсь тоже протестировать
     
  20. Voik

    Voik Гик

    В Esplorer работает (10:30):
     

    Вложения:

    • es10.JPG
      es10.JPG
      Размер файла:
      296,4 КБ
      Просмотров:
      79
    ИгорьК нравится это.