ESP8266 + Firebase


18.07.2018

Сейчас облачными хранилищами никого не удивишь. Все хранят данные в облаках. А может ли ESP8266 под NodeMCU использовать облачные хранилища? А почему бы и нет. Давайте заставим ESP8266 отправлять данные в базу данных FireBase.

Firebase

Firebase - это больше чем просто хранилище данных, подробнее на сайте http://firebase.google.com/. Но мы будем использовать сервис FireBase только для хранения данных в их документо- ориентированной базе данных. Google в 2014 году поглотил Firebase и теперь Google предоставляет эти услуги. Искренне надеюсь, что Google не скоро похоронят* Firebase, и мы успеем им чуток попользоваться.

REST API для Firebase

Для Firebase сделан REST API, поэтому его можно ковырять HTTPS запросами, что худо-бедно умеет делать NodeMCU.

Настройка параметров базы данных Firebase

- Для начала надо зайти на http://firebase.google.com/ и создать проект. Нам понадобится APIKEY.
Firebase APIKEY

- Затем создаем базу данных (Realtime Database)
Firebase Realtime Database

- В правилах прописываем авторизацию для записи, читать разрешаем всем, у нас секретов не будет мы будем хранить погодные данные
Firebase Rules

- Заходим в правила авторизации и включаем "адрес электронной почты и пароль"
Firebase Auth

- добавляем пользователей, которые будут работать с базой. E-mail можно указывать отфонарный его валидация не требуется
Firebase Users. Настройка

Ну а теперь пример скрипта на lua, который аутентифицируется и пишет данные в базу Firebase.


--WiFi Settup
--wifi.setmode(wifi.STATION)
--local cfg={}
--cfg.ssid="WiFiSSID"
--cfg.pwd="WiFiPassword"
--wifi.sta.config(cfg)
--cfg = nil
--collectgarbage()
-- Firebase settings

FB_APIKEY = "ApiKey"
FB_EMAIL = "[email protected]"
FB_PASSWORD = "password"
FB_PROJECT = "https://mytestproject.firebaseio.com/weather.json?auth="

-- Global Variables
weather_data = {D=0, P=0, T=0, H=0}
firebaseIdToken = ''

function firebaseAuth(resend)
  uri = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key="..FB_APIKEY
  data = '{"email":"'..FB_EMAIL..'","password":"'..FB_PASSWORD..'","returnSecureToken":true}'
  http.post(uri,
    'Content-Type: application/json\r\n',
    data,
    function(http_code, http_data)
      print (http_code)
      response = sjson.decode(http_data)
      firebaseIdToken = response['idToken']
      if resend == true then
        firebaseSendData()
      end
    end)
end

function firebaseSendData()
  print('Sending...')
  http.post(FB_PROJECT..firebaseIdToken,
    'Content-Type: application/json\r\nConnection: close\r\n',
    '{"D":'..weather_data.D..', "T":'..weather_data.T..', "P":'..weather_data.P..', "H":'..weather_data.H..'}',
    function(http_code, http_data)
      print(http_code)
      print(http_data)
      -- if idToken is expired
      if (http_code == 401) then
        firebaseAuth(true)
      end
    end
  )
end

sntp.sync()

firebaseAuth(false)
-- IIC init
local sda = 3 -- GPIO14
local scl = 4 -- GPIO12
--local sla = 0x3c
i2c.setup(0, sda, scl, i2c.SLOW)
--Init BME280
bme280.setup()
--First reading always is incorrect
local P, T = bme280.baro()
tmr.delay(100000)
cron.schedule("*/5 * * * *", function(e)
print('Sheduler')
-- get current datetime
local sec, usec = rtctime.get()
-- if time is synchronized
if sec > 1514764800 then
  weather_data.D = sec
  local P, T = bme280.baro()
  local H, t = bme280.humi()
  weather_data.P = P
  weather_data.T = T/100
  weather_data.H = H/1000
  firebaseSendData()
end
end)

Скачать пример работы ESP8266 NodeMCU с Firebase GitHub Этот скрипт периодически опрашивает состояние датчика BME280 и записывает данные (дату, температуру, давление, влажность) в Firebase. Вернее сказать, он пытается отправить данные. А если получает ответ 401 (idToken is expired), тогда проходит аутентификацию с теми данными, которые нужно указать в скрипте. После удачной аутентификации получает idToken с которым и ходит писать в базу пока idToken валидный. idToken выдается, кажется, на 30 минут.

Лирика

Можно было немного шире рассказать о работе ESP8266 с Firebase, показать как через интернет можно управлять состоянием ног ESP8266, включать свет, крутить серву, и всякое такое... НО, но, но ... я настоятельно рекомендую ESP8266 всем начинающим. И если Ваши дети или Вы желаете попробовать что-то сделать с электроникой, побаловаться программированием контроллеров - купите ESP. И не только потому что это стоит недорого, а вот почему. Парочка ESP8266 + NodeMCU меня откровенно достали своими глюками, и крайне нестабильной работой. Нет, конечно, для проектов, где чел всегда может передернуть его по питанию, ESP8266 сгодится. А если его спрятать подальше, где нибудь на крыше, то регулярный фитнес Вам обеспечен. Я был крайне разочарован нестабильной работой ESP8266, когда вышел модуль ESP-01. К слову сказать, он появился у меня спустя несколько месяцев после начала его выпуска. Он периодически, по непонятным причинам, терял связь, уходил в себя. Можно было на него забить и через несколько часов или дней он сам возвращался к жизни (без ребута, без сброса питания). Обновление прошивок ситуацию кардинально не меняло. Модуль мог неделю работать как часы, а потом снова глючить несколько дней подряд. Перепробовал все - и мощный блок питания и 1-2 метра от Wi-Fi роутера и роутеры менял. Никакой разницы. Тогда я все списал на "первую версию". К тому же у него была крайне скудная периферия. 2 ноги да TX, RX - это вообще ничего. Тогда я сложил свои ESP-01 в коробочку и несколько лет вообще не смотрел в их сторону. И когда мне говорили "а чо ты не юзаешь ESP8266? круть какая шьтука...можно умный дом на них зделать..." я с трудом подавлял рвотный рефлекс. Но, со временем душевные раны затянулись, а массовая истерия вокруг ESP8266 заинтриговала меня, и я решил попробовать снова, ну уже с модулем ESP-12. "Ну в версии модуля ESP-12 уже все баги пофиксены! Да и ног наружу торчит вон сколько! Размах! Прогресс!" - подумал я. Ага! ЩАС! На модуле ножек стало больше. Но начинка до боли знакомая. Тот же дешевый 32-разрядный контроллер с нищебродской периферией, флеш память только по-больше припаяли. Даже у старючей 8-разрядной Atmega8 периферия куда богаче. Ну даладно, зато есть WiFi. Я искренне пытался сделать все, чтобы ESP8266 раскрыл все свои сильные стороны в моих проектах. И он раскрыл. Действительно, с ESP8266 и NodeMCU проекты создавать очень быстро и можно даже красиво. И некоторые вещи, которые я сделал, даже мне немного нравятся, например этот GPS трекер или Метеостанция. Но работают они - *опа, как нестабильно! И если Вы повторите любой из этих проектов в точности, включите, а он не работает, а скорее всего, работает, но не так - это НОРМАЛЬНО! Для этого китайского контроллера - это нормально! А если все сразу заработает — это тоже нормально для этого китайского микроконтроллера, но радоваться все равно не спешите. И что вообще в нем происходит и почему — не понять. Ну вот хотя бы взять этот примитивный скрипт для работы с Firebase. В скрипте для того чтобы с заданной периодичностью отправлять данные используется cron.schedule. И Вы там найдете строчку print('Sheduler') Зачем она там? Консоль никто не смотрит? Если ее убрать, через 5 минут, когда cron.schedule попытается выполнить все что надо, NodeMCU после фатальной ошибки уходит в ребут. А простой print это "лечит"! А в другом проект cron.schedule работал без этого глюка. Это как понять? Собственно, эта мелочь и стала "последней каплей", до этого было много других "чудес". Но Вы обязательно купите своему ребенку ESP8266 (или что там есть поновее) или сами с него начните. И обязательно с NodeMCU. Если человек справится, сможет что-то сделать, обойти все глюки, не сломается - сможет дальше заниматься микроконтроллерами, но не ESP, конечно, а другими, настоящими. Успхов. P.S. Этой статьей я заканчиваю цикл статей про ESP8266 и NodeMCU. P.S. P.S. * Если в один из дней Firebase перестанет работать, лично меня это не удивит. Проекты похороненные Google:
  • Panoramio (куплен 2007, закрыт 2017)
  • Picasa(куплен 2004, закрыт 2016)
  • Google Codes (куплен 2004, закрыт 2016)
  • Google Health (закрыт 2012)
  • Google Catalogs (закрыт 2015)
  • Dodgeball (куплен 2005, закрыт 2007)
  • Google Reader (закрыт 2013)
  • iGoogle (закрыт 2013)
  • Google Talk (закрыт 2013)
  • Knol (закрыт 2011)
  • Google Buzz (закрыт 2011)
  • Aardvark (куплен 2010, закрыт 2011)
  • Google Notebook (закрыт 2011)
  • Google Dictionary (закрыт 2011)
  • Google Labs (закрыт 2011)
  • Google Wave (закрыт 2009)
  • Google Searchwiki (закрыт 2010)
  • Dodgeball (куплен 2005, закрыт 2009)
  • Jaiku (закрыт 2009)
  • Google Answers (закрыт 2006)
и это только интернет-проекты...

Дивись також:

ESP8266
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви