Advertisement
Guest User

Untitled

a guest
May 21st, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.70 KB | None | 0 0
  1. os.sleep(2)
  2.  
  3. local io = io
  4. local os = os
  5. local table = table
  6. local string = string
  7. local print = print
  8. local pcall = pcall
  9. local require = require
  10. local loadfile = loadfile
  11.  
  12. local component = require("component")
  13. local term = require("term")
  14. local event = require("event")
  15. local c = require("computer")
  16. local fs = require("filesystem")
  17. local serialization = require("serialization")
  18.  
  19. if not component.isAvailable("modem") then
  20. term.clear()
  21. print("Fehler kein Modem gefunden")
  22. os.exit()
  23. end
  24.  
  25. local m = component.getPrimary("modem")
  26.  
  27. local verschieben = function(von, nach) fs.remove(nach) fs.rename(von, nach) print(string.format("%s → %s", fs.canonical(von), fs.canonical(nach))) end
  28. local entfernen = function(datei) fs.remove(datei) print(string.format("'%s' wurde gelöscht", datei)) end
  29.  
  30. local min_update_zeit = 5
  31. local letzter_check = c.uptime() - min_update_zeit - 1
  32. local letzter_anders = letzter_check
  33. local port = 918
  34. local tank = {}
  35. local f = {}
  36. local o = {}
  37.  
  38. tank[1] = {}
  39.  
  40. local adresse, empfangen, version, reichweite, Tankname
  41.  
  42. local function gt(k)
  43. local menge = 0
  44. local maxmenge = 0
  45. for i = 1, 16 do
  46. local EU = k.getBatteryCharge(i)
  47. if EU then
  48. menge = menge + EU
  49. maxmenge = maxmenge + k.getMaxBatteryCharge(i)
  50. end
  51. end
  52. return "EU", "EU", "EU", menge, maxmenge
  53. end
  54.  
  55. local function ic2(k)
  56. local a = "getStored"
  57. if not k[a] then
  58. a = "getEnergy"
  59. end
  60. return "EU", "EU", "EU", k[a](), k.getCapacity()
  61. end
  62.  
  63. local function rf(k)
  64. return "RF", "RF", "RF", k.getEnergyStored(), k.getMaxEnergyStored()
  65. end
  66. --return name, label, einheit, menge, maxmenge
  67.  
  68. local andere = {
  69. {gt, "gt_batterybuffer"},
  70. {ic2, "chargepad_batbox"},
  71. {ic2, "chargepad_cesu"},
  72. {ic2, "chargepad_mfe"},
  73. {ic2, "chargepad_mfsu"},
  74. {ic2, "batbox"},
  75. {ic2, "cesu"},
  76. {ic2, "mfe"},
  77. {ic2, "mfsu"},
  78. {rf, "capacitor_bank"},
  79. {rf, "energy_device"},
  80. }
  81.  
  82. if fs.exists("/tank/version.txt") then
  83. local d = io.open ("/tank/version.txt", "r")
  84. version = d:read()
  85. d:close()
  86. else
  87. version = "<FEHLER>"
  88. end
  89.  
  90. if fs.exists("/home/Tankname") then
  91. local d = io.open("/home/Tankname", "r")
  92. Tankname = d:read()
  93. if string.len(Tankname) <= 2 then
  94. Tankname = "false"
  95. end
  96. d:close()
  97. else
  98. term.clear()
  99. print("Soll dieser Sensor einen Namen bekommen? [j/N]")
  100. local d = io.open("/home/Tankname", "w")
  101. if string.lower(io.read()) == "j" then
  102. print("Bitte Namen eingeben")
  103. term.write("Eingabe: ")
  104. Tankname = io.read()
  105. if string.len(Tankname) <= 2 then
  106. d:write("false")
  107. else
  108. d:write(Tankname)
  109. end
  110. else
  111. d:write("false")
  112. end
  113. d:close()
  114. Tankname = "false"
  115. end
  116.  
  117. local function firstToUpper(str)
  118. return (str:gsub("^%l", string.upper))
  119. end
  120.  
  121. function f.check()
  122. tank = {}
  123. local i = 1
  124. ---------------------------------------------------------------------------
  125. ---------------------------------------------------------------------------
  126. ---------------------------------------------------------------------------
  127. for _, CompName in pairs({"tank_controller", "transposer"}) do
  128. for adresse in pairs(component.list(CompName)) do
  129. local k = component.proxy(adresse)
  130. for side = 0, 5 do
  131. if type(k.getFluidInTank(side)) == "table" then
  132. for a, b in pairs(k.getFluidInTank(side)) do
  133. if type(a) == "number" then
  134. local dazu = true
  135. local c
  136. for j, k in pairs(tank) do
  137. if b.name == k.name then
  138. dazu = false
  139. c = j
  140. break
  141. end
  142. end
  143. if dazu then
  144. tank[i] = {}
  145. tank[i].name = b.name
  146. tank[i].label = b.label
  147. tank[i].einheit = "mb"
  148. tank[i].menge = b.amount
  149. tank[i].maxmenge = b.capacity
  150. i = i + 1
  151. else
  152. tank[c].menge = tank[c].menge + b.amount
  153. tank[c].maxmenge = tank[c].maxmenge + b.capacity
  154. end
  155. end
  156. end
  157. end
  158. end
  159. end
  160. end
  161. ---------------------------------------------------------------------------
  162. ---------------------------------------------------------------------------
  163. ---------------------------------------------------------------------------
  164. for _, CompName in pairs({"me_controller", "me_interface"}) do
  165. for adresse in pairs(component.list(CompName)) do
  166. local k = component.proxy(adresse)
  167. for _, typ in pairs({{"mb", "getFluidsInNetwork"}, {"", "getEssentiaInNetwork"}, {"", "GetGasesInNetwork"}}) do
  168. if k[typ[2]] then
  169. for _, b in pairs(k[typ[2]]()) do
  170. if type(b) == "table" then
  171. if typ[2] == "getEssentiaInNetwork" then
  172. b.label = string.sub(b.label, 0, string.len(b.label) - 4)
  173. b.name = string.lower(b.label)
  174. end
  175. local dazu = true
  176. local c
  177. for j, k in pairs(tank) do
  178. if b.name == k.name then
  179. dazu = false
  180. c = j
  181. break
  182. end
  183. end
  184. if dazu then
  185. tank[i] = {}
  186. tank[i].name = b.name
  187. tank[i].label = b.label
  188. tank[i].einheit = typ[1]
  189. tank[i].menge = b.amount
  190. tank[i].maxmenge = b.amount
  191. i = i + 1
  192. else
  193. tank[c].menge = tank[c].menge + b.amount
  194. tank[c].maxmenge = tank[c].maxmenge + b.amount
  195. end
  196. end
  197. end
  198. end
  199. end
  200. end
  201. end
  202. ---------------------------------------------------------------------------
  203. ---------------------------------------------------------------------------
  204. ---------------------------------------------------------------------------
  205. for _, CompName in pairs({"blockjar_0", "blockjar_3", "blockcreativejar_3", "blocktube_2", "blocktube_4", "blockmetaldevice_1", "blockstonedevice_14", "blockessentiareservoir"}) do
  206. for adresse in pairs(component.list(CompName)) do
  207. local k = component.proxy(adresse)
  208. local name = k.getEssentiaType(0)
  209. if name then
  210. local label = firstToUpper(name)
  211. local menge = k.getEssentiaAmount(0)
  212. local maxmenge = 64
  213. local dazu = true
  214. local c
  215. for j, k in pairs(tank) do
  216. if name == k.name then
  217. dazu = false
  218. c = j
  219. break
  220. end
  221. end
  222. if dazu then
  223. tank[i] = {}
  224. tank[i].name = name
  225. tank[i].label = label
  226. tank[i].einheit = ""
  227. tank[i].menge = menge
  228. tank[i].maxmenge = maxmenge
  229. i = i + 1
  230. else
  231. tank[c].menge = tank[c].menge + menge
  232. tank[c].maxmenge = tank[c].maxmenge + maxmenge
  233. end
  234. end
  235. end
  236. end
  237. ---------------------------------------------------------------------------
  238. ---------------------------------------------------------------------------
  239. ---------------------------------------------------------------------------
  240. for _, CompName in pairs({"jar_normal", "jar_void"}) do
  241. for adresse in pairs(component.list(CompName)) do
  242. local k = component.proxy(adresse)
  243. for label, menge in pairs(k.getAspects()) do
  244. local name = label:lower()
  245. local maxmenge = 250
  246. local dazu = true
  247. local c
  248. for j, k in pairs(tank) do
  249. if name == k.name then
  250. dazu = false
  251. c = j
  252. break
  253. end
  254. end
  255. if dazu then
  256. tank[i] = {}
  257. tank[i].name = name
  258. tank[i].label = label
  259. tank[i].einheit = ""
  260. tank[i].menge = menge
  261. tank[i].maxmenge = maxmenge
  262. i = i + 1
  263. else
  264. tank[c].menge = tank[c].menge + menge
  265. tank[c].maxmenge = tank[c].maxmenge + maxmenge
  266. end
  267. end
  268. end
  269. end
  270. ---------------------------------------------------------------------------
  271. ---------------------------------------------------------------------------
  272. ---------------------------------------------------------------------------
  273. for _, v in pairs(andere) do
  274. for adresse in pairs(component.list(v[2])) do
  275. local k = component.proxy(adresse)
  276. local name, label, einheit, menge, maxmenge = v[1](k)
  277. if type(tank[i - 1]) == "table" then
  278. if tank[i - 1].name == name then
  279. tank[i - 1].menge = tank[i - 1].menge + menge
  280. tank[i - 1].maxmenge = tank[i - 1].maxmenge + maxmenge
  281. else
  282. tank[i] = {}
  283. tank[i].name = name
  284. tank[i].label = label
  285. tank[i].einheit = einheit
  286. tank[i].menge = menge
  287. tank[i].maxmenge = maxmenge
  288. i = i + 1
  289. end
  290. else
  291. tank[i] = {}
  292. tank[i].name = name
  293. tank[i].label = label
  294. tank[i].einheit = einheit
  295. tank[i].menge = menge
  296. tank[i].maxmenge = maxmenge
  297. i = i + 1
  298. end
  299. end
  300. end
  301. ---------------------------------------------------------------------------
  302. ---------------------------------------------------------------------------
  303. ---------------------------------------------------------------------------
  304. print("\n\n\n" .. Tankname .. "\n" .. letzter_check .. "------------------------------")
  305. for i in pairs(tank) do
  306. if tank[i].name then
  307. print(string.format("%s - %s: %s/%s %.1f%%", tank[i].name, tank[i].label, tank[i].menge, tank[i].maxmenge, tank[i].menge / tank[i].maxmenge * 100))
  308. end
  309. end
  310. letzter_check = c.uptime()
  311. return tank
  312. end
  313.  
  314. function f.serialize(eingabe)
  315. if type(eingabe) == "table" then
  316. local ausgabe = {}
  317. local i = 1
  318. if Tankname then
  319. ausgabe[i] = string.format([==[[%s] = {name="Tankname", label="%s", menge="1", maxmenge="1", einheit=""}, ]==], i, Tankname)
  320. i = i + 1
  321. end
  322. for k, v in pairs(eingabe) do
  323. if v.name then
  324. ausgabe[i] = string.format([==[[%s] = {name="%s", label="%s", menge="%s", maxmenge="%s", einheit="%s"}, ]==], i, v.name, v.label, v.menge, v.maxmenge, v.einheit)
  325. i = i + 1
  326. end
  327. end
  328. return "{" .. table.concat(ausgabe) .. "}"
  329. elseif type(eingabe) == "function" then
  330. return false, "<FEHLER> Funktionen können nicht gesendet werden"
  331. else
  332. return eingabe
  333. end
  334. end
  335.  
  336. function o.datei(signal)
  337. if not fs.exists("/update/tank") then
  338. fs.makeDirectory("/update/tank")
  339. end
  340. if type(signal[7]) == "string" and type(signal[8]) == "string" then
  341. print("\nEmpfange Datei ... " .. signal[7])
  342. local d = io.open("/update" .. signal[7], signal[9])
  343. d:write(signal[8])
  344. d:close()
  345. f.senden(signal, "speichern", fs.exists("/update" .. signal[7]), signal[7])
  346. else
  347. print("<FEHLER>")
  348. print("signal[7] " .. tostring(signal[7]))
  349. print("signal[8] " .. tostring(signal[8]))
  350. f.senden(signal, "speichern", false, signal[7])
  351. end
  352. end
  353.  
  354. function o.aktualisieren(signal)
  355. local weiter = true
  356. local daten = serialization.unserialize(signal[7])
  357. for k, v in pairs(daten) do
  358. if not fs.exists("/update" .. v) then
  359. weiter = false
  360. print("<FEHLER>")
  361. print("Datei fehlt: " .. tostring(v))
  362. f.senden(signal, "speichern", false, v)
  363. end
  364. end
  365. if weiter then
  366. print("Ersetze alte Dateien")
  367. for k, v in pairs(daten) do
  368. verschieben("/update/" .. v, "/" .. v)
  369. end
  370. entfernen("/update")
  371. print("Update vollständig")
  372. o.datei = nil
  373. os.sleep(1)
  374. for i = 5, 1, -1 do
  375. print(string.format("\nNeustarten in %ss", i))
  376. os.sleep(1)
  377. end
  378. require("computer").shutdown(true)
  379. end
  380. end
  381.  
  382. function o.tank(signal)
  383. if c.uptime() - letzter_check > min_update_zeit then
  384. f.senden(signal, "tankliste", version, f.serialize(f.check()))
  385. end
  386. end
  387.  
  388. function f.anders()
  389. if c.uptime() - letzter_anders > min_update_zeit then
  390. m.broadcast(port + 1, "tankliste", version, f.serialize(f.check()))
  391. letzter_anders = c.uptime()
  392. end
  393. end
  394.  
  395. function f.lange_nichts()
  396. if c.uptime() - letzter_anders > 6000 then
  397. m.broadcast(port + 1, "tankliste", version, f.serialize(f.check()))
  398. letzter_anders = c.uptime()
  399. end
  400. end
  401.  
  402. function f.loop(...)
  403. print("\n\n")
  404. print(...)
  405. local signal = {...}
  406. print(signal[6])
  407. if o[signal[6]] then
  408. o[signal[6]](signal)
  409. end
  410. end
  411.  
  412. function f.senden(signal, name, nachricht, ...)
  413. if m.isWireless() then
  414. m.setStrength(tonumber(signal[5]) + 50)
  415. end
  416. m.send(signal[3], signal[4] + 1, name, f.serialize(nachricht), ...)
  417. end
  418.  
  419. function f.main()
  420. m.open(port)
  421. m.setWakeMessage("tank", true)
  422. if m.isWireless() then
  423. m.setStrength(math.huge)
  424. end
  425. term.clear()
  426. print("Sende Anmeldung")
  427. print("\n" .. Tankname)
  428. f.anders()
  429. print("Warte auf Antwort...")
  430. local langes_warten = event.timer(600, f.lange_nichts, math.huge)
  431. event.listen("modem_message", f.loop)
  432. event.listen("component_added", f.anders)
  433. event.listen("component_removed", f.anders)
  434. pcall(os.sleep, math.huge)
  435. event.ignore("modem_message", f.loop)
  436. event.ignore("component_added", f.anders)
  437. event.ignore("component_removed", f.anders)
  438. event.cancel(langes_warten)
  439. end
  440.  
  441. loadfile("/bin/label.lua")("-a", require("computer").getBootAddress(), "Tanksensor")
  442.  
  443. print(pcall(f.main))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement