Lua, meine Minions, die Weltherrschaft und... äääh... ich... \o/
Ich habe jetzt auch
Minions... wie jeder, der ganz oder zumindest fast ein bissl die Weltherrschaft anstrebt... ;-)
ESP8266-Module anderer Bauart liegen hier sowieso herum, aber die kleinen netten kubistischen
Minions haben mit ihrem USB-Anschluß natürlich Vorteile im Handling und so haben sie meine ESP8266-Forschung in ganz andere Dimensionen katapultiert.
Stellen wir also erstmal den gelben Racker auf den Kopf und schauen wir einem schon mit ein paar Händen von Code angelernten Minion beim Arbeiten zu:
Code: Alles auswählen
(yeti@aurora:5)~$ telnet nodemcu0
Trying 192.168.2.105...
Connected to nodemcu0.###DOMAIN###.
Escape character is '^]'.
Welcome to NodeMcu world.
stdin:1: unexpected symbol near '
Dieser Fehler entsteht nicht, wenn man sich mit "nc nodemcu0 23" statt per Telnet verbindet, also später mal erforschen... jetzt gibt's Wichtigeres zu zeigen.
Offensichtlich ist der kleine Racker nach Einschalten nicht nur im Netz präsent, sondern sogar per Telnet ansprechbar...
Also mal schauen, was sich in dessen Startup-File so verbirgt:
Code: Alles auswählen
> file.open("init.lua") print(file.read()) file.close()
dofile("init-sta.lc")
dofile("telnetd.lc") -- think big! ;-)
dofile("thingspeak.lc")
Erwischt!
Also mal weiter stochern...
"*.lc"-Files sind vorkompilierte "*.lua"-Programme... also jeweils die Quellen durchsehen:
Code: Alles auswählen
> file.open("init-sta.lua") print(file.read()) file.close()
wifi.setmode(wifi.STATION)
wifi.sta.config("###SSID###","###WLAN-PASSWORD###")
wifi.sta.connect()
...mehr braucht's tatsächlich nicht, um die kleinen Kerlchen ins WLAN zu bringen...
Code: Alles auswählen
> file.open("telnetd.lua") print(file.read()) file.close()
s=net.createServer(net.TCP,3600)
s:listen(23,
function(c)
function s_output(str) if c~=nil then c:send(str) end end
node.output(s_output, 0)
c:on("receive",function(c,l) node.input(l) end)
c:on("disconnection",function(c) node.output(nil) end)
print("Welcome to NodeMcu world.")
end
)
...obriges Fragment macht den Kleinen per Telnet erreichbar.
Code: Alles auswählen
file.open("thingspeak.lua") print(file.read()) file.close()
-- 600000 = 10 min
tmr.alarm(0,600000,1,
function()
conn=net.createConnection(net.TCP,0)
conn:on("receive",function(conn,str) print(str) end)
conn:connect(80,'184.106.153.149') -- api.thingspeak.com
conn:send(string.format("GET /update?key=###ThhingSpeakKey###&field1=%d&field2=%d&field3=%d&field4=%d&ignore=%d HTTP/1.1\r\nHost: api.thingspeak.com\r\nAccept: */*\r\n\r\n",tmr.now(),node.heap(),file.fsinfo()))
conn:on("sent",function(conn) print("Closing connection") conn:close() end)
conn:on("disconnection",function(conn) print("Got disconnection...") end)
end
)
Und das ist sozusagen die halbe Intensivstation: Alle 10 Minuten schickt dies Fragment den Stand der inneren Uhr, den freien Platz aufm Heap und Angaben zur Ausnutzung des Filesystemes zu ThingSpeak, wo man ann das Wohlergehen dieses Helferleins online überwachen kann:
https://thingspeak.com/channels/42511
Edit-20150711-0425-CEST: https://thingspeak.com/channels/46460 für den 2ten Lua-Minion.
Edit-20170326-1555-GMT: Thingspeak-URLs bitte ignorieren, denn ich habe mich dort wieder abgemeldet...
Code: Alles auswählen
> for n,s in pairs(file.list()) do print(string.format("%7d %s",s,n)) end
490 ircbot.lua
921 w.lua
111 ap-list.lua
680 telnetd.lc
300 telnetd.lua
1012 thingspeak.lc
590 thingspeak.lua
228 init-sta.lc
809 web-misc.lua
128 init.lc
88 init.lua
579 ircclient.lua
1084 web-cat.lua
97 init-sta.lua
> print(string.format("free: %d, used: %d, total: %d",file.fsinfo()))
free: 3413851, used: 12550, total: 3426401
> _
Ich denk das reicht erstmal als Appetitanreger...
:-D
-----8<-----{Edit-20150616-1845-CEST meint: Es muß nicht immer Thingspeak sein!}----->8-----
Code: Alles auswählen
irc=net.createConnection(net.TCP,0)
irc:on("receive",
function(irc,s)
if string.find(s,"PING :")==1 then
irc:send("PONG :"..s:sub(7))
else
print(s)
end
end
)
irc:on("connection",
function(irc)
irc:send("NICK minion0\r\n")
irc:send("USER minion0 minion0 minion0 :norbit minion\r\n")
end
)
irc:connect(6667,"irc.german-elite.org")
-----8<-----{Edit-20150620-1645-CEST meint: Man sollte wohl besser nicht verschweigen:}----->8-----
Der
Minion kam mit falscher Firmware oder hirnmäßig ganz nackisch daher, also jedenfalls nicht mit NodeMCU herinnen. Ähnliches berichten auch mehrere der Käufer in Kommentaren unter dem Angebot. Aber das ist Alles kein Drama, es gibt genug alleinstehende Flashtools oder man benutzt gleich das komplette ESP-SDK und baut sich NodeMCU komplett aus den Quellen selber (was später auch den Weg zu angepaßten Varianten (z.B. ohne MQTT, Fließkommazahlen und Kryptokram) eröffnet)...
-----8<-----{Edit-20150628-0433-CEST meint: Man wird ja wohl noch träumen dürfen...}----->8-----
Durch "
Move const data to ROM, freeing up ~16k of RAM" stößt die Nützlichkeit von Lua auf den ESP8266erchen wohl in eine andere Dimension vor. Das soll sich erstmal in paar Tage setzen bevor ich mich darauf stürze...
Was wären die nächsten hoffentlich bald auftauchenden guten Nachrichten?
- Wählbare Geschwindigkeiten und Slave-Modus für I2C und SPI. Man stelle sich einfach mal frech vor, der ESP8266 spielt I2C-EEPROM für einen Propeller und serviert diesem 32- oder 64k aus seinem Flash... nur mal als eine höllische Idee von Vielen... :-)
- Ein kombinierter Telnet- und HTTP-Server in Lua (das läßt sich auf denselben Port tricksen, ist wahrscheinlich nur Fleißarbeit) oder mehr als nur einen Server-"Prozeß" auf tieferer Ebene der Firmware ermöglichen.
- Von Mesh-Libs in ESP-Arduino-Ast las ich schon und im Lua-Umfeld wird zumindest auch schon öffentlich davon geträumt. Auf Beides wird wohl noch eine Weile zu warten sein... ich bin hoch gespannt...
- Drastisch purzelnde Preise bei Solarzellen wären dann auch noch eine Nachricht, die einen Feiertag wert wäre... ein Nachbarschafts-Mesh mit Versorgung aus dem in 8 Lichtminuten Entfernung eh am Himmel stehenden Fusionsreaktor wäre der Hit!
-----8<-----{Edit-20150709-2137-CEST meint: jetzt mal den Zweig "dev096" antesten...}----->8-----
Frisch geflasht, wahrscheinlich also auch mit voll gekilltem Filesystem...
Code: Alles auswählen
NodeMCU 0.9.6 build 20150627 powered by Lua 5.1.4
lua: cannot open init.lua
> =node.info()
0 9 6 10768729 1458415 4096 0 40000000
> =node.heap()
34368
...eyyyyy!!! das sind aber nicht die versprochenen 16kBytes mehr... wahrscheinlich ist an anderer Stelle zusätzliche Funktonalität hinzugekommen, die ich später mal, wenn ich so richtig weiß, was ich alles nicht brauche, dann beim Kompilieren auch weglassen kann... also jetzt mal lamsan 1:1 dieselbe Funktionalität wie zuvor auf den kleinen frisch geflashten Minion übertragen...
Ok... weiter per WLAN:
Code: Alles auswählen
Welcome to NodeMcu world.
> =node.heap()
28568
> for p,s in pairs(file.list()) do print(s.."\t"..p) end
61 init.lua
228 init-sta.lc
318 telnetd.lua
148 init.lc
888 thingspeak.lc
499 thingspeak.lua
680 telnetd.lc
97 init-sta.lua
> _
...er läuft... was nun? Erstmal wieder vom Notebook abstöpseln und dahin bewegen wo er zuhause ist... dann lange genug laufen lassen bis auf Thingspeak erste aussagekräftige Überwachungsergebnisse vorliegen... nach dieser Neukonditionierung ist erstmal ein paar Stunden Intensivstation angesagt... klar...
-----8<-----{Edit-20150711-0253-CEST meint: Gerechtigkeit muß!!!}----->8-----
Nachdem ich in dem diesem Beitrag folgenden Schrieb das Flashen von Micropython erwähnte, meinte Edit, das müsse ich aber unbedingt auch für Lua nachholen. Recht hat Edit!!! Also wird hier nachgeliefert und das Gerechtigkeitsdefizit somit beseitigt:
Code: Alles auswählen
(yeti@aurora:4)/opt/nodemcu-firmware$ make flash
make -C ./app flash
make[1]: Entering directory '/opt/nodemcu-firmware/app'
../tools/esptool.py --port /dev/ttyUSB0 write_flash 0x00000 ../bin/0x00000.bin 0x10000 ../bin/0x10000.bin
Connecting...
Erasing flash...
Writing at 0x00008800... (100 %)
Erasing flash...
Writing at 0x00070400... (100 %)
Leaving...
make[1]: Leaving directory '/opt/nodemcu-firmware/app'
(yeti@aurora:4)/opt/nodemcu-firmware$ _
Nun zufrieden, Edit? o;-)
-----8<-----{Edit-20151024-1515-CEST meint: Machma' Update, Alda!}----->8-----
...mal den "dev140"-Branch antesten...
Code: Alles auswählen
NodeMCU 1.4.0 build 20151006 powered by Lua 5.1.4 on SDK 1.4.0
lua: cannot open init.lua
> =node.heap()
41104
Gigantisch!
...aber was nützt's, wenn ich WiFi nicht hoch kriege?
Hab ich es nur zu lange nicht benutzt oder hat sich etwas dramatisch verändert?
Brauch ich'n Kenntnisupdate für den "dev1440" Branch?
Also erstmal zurück zum stabilen Branch "master", damit ich nicht das ganze Wochendende mit diesem Thema verdaddele...
-----8<-----{Edit meint: Dies wird wohl nicht das Ende sein...}----->8-----