суббота, 10 декабря 2016 г.

#ESP.Meteo: Wi-Fi логгер с автономным питанием в Twitter-e

В продолжении цикла по использованию Lua для встраиваемых систем, было решено расширить функционал "вечного" Wi-Fi логгера с питанием от солнечной панели и ионисторов резервным каналом в соцсетях. Идеальным вариантом видится сервис коротких сообщений и ранее его успешно использовали для погодного бота USB.HID термометра (чего только стоят почти полмиллиона его твиттов c 2011-го по 2013 год). Даже забавно, с ботом пытались общаться через ЛС. В то же время то решение давно потеряло свою актуальность в плане автономности и энергосбережения, хотя отдельные пользователи до сих пор, а на носу 2017-й, используют второй WEB-сервер для обратного контроля нагрузок из браузера. Однако вернемся к новой фиче под ESP8266...

Предпосылки реализации....

К сожалению, использовать нынешний API Twitter в виде oAuth 2.0 напрямую из NodeMCU не получится. Но остается обходной "финт ушами" в виде приложения-сервиса ThingTweet от того же облачного сервиса ThingSpeak, который мы уже используем для архивации и визуализации температурных трендов, питания, времени поднятия системы и состояния датчиков. По сути, все сводится к использованию прослойки-сервиса, которая и будет за нас производить авторизацию, запись и чтение постов в привязанном Twitter-аккаунте обычным POST-запросом. Да-да, даже не понадобится использовать HTTPS.

Последовательность действий следующая:
  1. Если нет аккаунта, зарегистрируйтесь в ThingSpeak или перейдите по адресу https://thingspeak.com/apps/thingtweets
  2. Укажите логин-пароль для доступа к вашему Twitter-аккаунту.
  3. Получите API_KEY ключ для доступа
  4. Проверьте работоспособность отправки твитта простым текстом в адресной строке вашего браузера 'http://api.thingspeak.com/apps/thingtweet/1/statuses/update?api_key=API_KEY&status=TEXT' (кавычки уберите)
  5. Сработало? Теперь переходим к модификации нашего скрипта отправки 'httpsender.lua'.


Скрипт отправки
local t={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} -- список датчиков
-- 0- температура на улице
-- 1- температура картошки
-- 2- температура в комнате
-- 3- температура на кухне


local APIKEY1="APIKEY1" -- ключ на первые 8-датчиков
local APIKEY2="APIKEY2" -- ключ на вторые 8-датчиков
local APIKEY3="APIKEY3" -- ключ APP TWITTER
local r=tmr.now()
local g=gpio.read(dpin)

function reads18b20()
ds=require('ds18b20')
ds18b20.setup(tpin) -- GPIO2 ds18b20
adr=ds18b20.addrs()
n=table.getn(adr) -- кол-во датчиков
print("DS18B20 found: "..n.."\n")
for i=0, n-1, 1 do -- заполнение данными
t[i]=ds18b20.read(adr[i+1])
end
ds=nil
end

function msleep()
print("Sleep 300 sec down...")
node.dsleep(COUNTSLEEP)
end


function sendData3()
print("Sending data to TWITTER")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
conn:connect(80,'184.106.153.149')
conn:send("POST /apps/thingtweet/1/statuses/update?api_key="..APIKEY3.."&status=Temperature%20"..t[0].."%C2%B10.5%C2%B0C,%20Voltage%20ionistor%20"..u.."V,%20Time%20system%20UP%20"..r.."ms HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connect")
conn:close()
end)
conn:on("disconnection", function(conn)
print("Disconnect twitter thingspeak...")
msleep()
end)
end



function sendData2()
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com
conn:connect(80,'184.106.153.149')
conn:send("GET /update?key="..APIKEY2"&field1="..t[8].."&field2="..t[9].."&field3="..t[10].."&field4="..t[11].."&field5="..t[12].."&field6="..t[13].."&field7="..t[14].."&field7="..t[15].." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connect")
conn:close()
end)
conn:on("disconnection", function(conn)
print("Disconnect thingspeak...")
msleep()
end)
end


function sendData()
-- conection to thingspeak.com
print("Sending data to thingspeak.com")
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end)
-- api.thingspeak.com
conn:connect(80,'184.106.153.149')
conn:send("GET /update?key="..APIKEY1.."&field1="..t[0].."&field2="..u.."&field3="..g.."&field4="..r.."&field5="..t[4].."&field6="..t[5].."&field7="..t[6].."&field8="..t[7].." HTTP/1.1\r\n")
conn:send("Host: api.thingspeak.com\r\n")
conn:send("Accept: */*\r\n")
conn:send("User-Agent: Mozilla/4.0 (compatible; esp8266 Lua; Windows NT 5.1)\r\n")
conn:send("\r\n")
conn:on("sent",function(conn)
print("Closing connect")
conn:close()
end)
conn:on("disconnection", function(conn)
print("Disconnect thingspeak...")
sendData3()
end)
end

reads18b20() -- fix предварительное чтение
-- Wait 2000 ms for Init DS18B20 and last send to thingspeak
tmr.alarm(1, 2000, 1, function()
tmr.stop(1)

reads18b20()
for i=0, 15, 1 do
if t[i]==nil then -- fix отсутствия датчиков
print("DS18B20-N"..i.." not connected\n")
t[i]=0
else print("Temperature-"..i..": "..t[i].." °C\n") end
end

sendData()
end)
Обратите внимание, тут мы добавили отдельный код с POST-запросом в функции 'sendData3()', который вызываем после отработки запроса по трендам и закрытия соединения с предыдущим APIKEY1. Скрипт инициализации 'init.lua' и скрипт работы с датчиками остались без изменений. К слову напомним, что в HTML каждый спецсимвол имеет свой код и для того, чтобы не усложнять скрипт использованием URL Encode:
  1. Cимволы пробела в запросе заменены кодом %20
  2. ± на %C2%B1
  3. °C на %С2%B0C
Если этого не сделать, то POST-запрос будет оборван и в Twitter попадет часть вашего сообщения. Также имейте в виду, что сам Twitter имеет ограничение на количество в 140 символов, кроме адресов.

Постскриптум

Теперь остается перезаписать скрипт 'httpsender.lua' в EEPROM-ку с помощью LuaLoader и модуль ESP-12 продолжит цокотiти правое дело погодного бота )))


Ресурсы
  1. Стабильная прошивка-компилятор NodeMCU 0.9.6.bin с поддержкой операций с плавающей точкой https://github.com/nodemcu/nodemcu-firmware/releases
  2. Утилита-загрузчик скриптов LuaLoader https://github.com/GeoNomad/LuaLoader
  3. Утилита-прошивальщик компилятора NodeMCU - ESP8266Flasher https://github.com/nodemcu/nodemcu-flasher
  4. Страничка "вечного" Wi-Fi-логгера с автономным питанием в TWITTER https://twitter.com/ramedias
Проекты на базе ESP8266
  1. Прозрачный мост UART/Wi-Fi --- Wi-Fi/UART на базе ESP8266 на Lua 
  2. Wi-Fi лампа. Контроль DIO модуля ESP-01 (ESP8266) по Wi-Fi  
  3. Монтаж мезонином прозрачного моста Wi-Fi-UART на ESP8266
  4. Автономный датчик температуры по Wi-Fi на базе ESP8266
  5. Аномальная разрядная кривая ионисторов проекта "вечный" Wi-Fi логгер. Луна однако
  6. Работа "вечного" Wi-Fi логгера на солнечную панель из... аморфного кремния 
  7. #ESP.Meteo: Wi-Fi логгер с автономным питанием в Twitter-e  
  8. Вывод отладочной информации с ESP-12 на дисплей SSD1306

3 комментария:

  1. ...добавил в Twitter-посты дату-время UTC+2 и прогнозирование вероятности заморозков согласно эмпирическим зависимостям Броунова по точкам температуры в 13 и 21 час. Для этого выковыриваю дату-время из сервера utcnist2.colorado.edu, сохраняю точки в файлах на EEPROM-ке и вычитываю с перерасчетом зависимостей вероятность (методика по второй ссылке выше). Как это работает https://twitter.com/ramedias. Сам код портированный с Паскаля на Lua дам попозже )))

    ОтветитьУдалить
  2. Наконец-то облачное приложение ThingSpeak Twitter теперь поддерживает увеличенный Twitter-ом лимит с 140 до 280 символов https://twitter.com/ramedias

    ОтветитьУдалить

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.