Adapt boiler display for shared main shaft

This commit is contained in:
2026-07-16 20:50:42 +02:00
parent a91b354295
commit aac7e4f52d
2 changed files with 64 additions and 42 deletions
+7 -7
View File
@@ -21,8 +21,8 @@ werden ergaenzt, sobald die Peripherie- und Methodennamen der gebauten Anlagen f
## Einfache Create-Boiler-Anzeige ## Einfache Create-Boiler-Anzeige
Fuer die erste Kraftwerksanzeige werden ein Monitor, pro Boiler ein Create-Speedometer, Fuer die erste Kraftwerksanzeige werden ein Monitor, ein Create-Speedometer und
ein Create-Stressometer an der Hauptwelle und optional pro Boiler ein Block Reader aus ein Create-Stressometer an der gemeinsamen Hauptwelle sowie pro Boiler ein Block Reader aus
Advanced Peripherals ueber Wired Modems mit dem Computer verbunden. Installation und Start: Advanced Peripherals ueber Wired Modems mit dem Computer verbunden. Installation und Start:
```lua ```lua
@@ -30,11 +30,11 @@ wget https://git.peli-server.de/Dystroyer8/ATM10_CC_Codes/raw/branch/main/create
create_boiler_display create_boiler_display
``` ```
Das Programm zeigt pro Boiler Online-Status, RPM und - mit Block Reader - den Heizmodus. Das Programm liest Online-Status und Heizmodus jedes Boilers ueber dessen Block Reader.
Zusaetzlich zeigt es Kapazitaet, Verbrauch und Auslastung der Hauptwelle. Die Zuordnung erfolgt Drehzahl, Kapazitaet, Verbrauch und Auslastung werden fuer die gemeinsame Hauptwelle angezeigt.
nach den internen Peripheral-Namen; Speedometer und Block Reader sollten deshalb jeweils in der Die Boiler-Zuordnung erfolgt nach den internen Peripheral-Namen; die drei Block Reader sollten
Reihenfolge Boiler 1 bis 3 an das Wired Network angeschlossen werden. Jeder Block Reader muss deshalb in der Reihenfolge Boiler 1 bis 3 an das Wired Network angeschlossen werden. Jeder Block
auf den Controller-Tank des zugeordneten Boiler-Multiblocks zeigen. Reader muss auf den Controller-Tank des zugeordneten Boiler-Multiblocks zeigen.
## Struktur ## Struktur
+53 -31
View File
@@ -1,9 +1,9 @@
-- Create boiler status board for CC:Tweaked. -- Create boiler status board for CC:Tweaked.
-- Hardware: -- Hardware:
-- * one monitor -- * one monitor
-- * one Create Speedometer per boiler -- * one Create Speedometer on the shared main shaft
-- * one Create Stressometer on the main shaft -- * one Create Stressometer on the main shaft
-- * optionally one Advanced Peripherals Block Reader per boiler controller -- * one Advanced Peripherals Block Reader per boiler controller
-- Everything must be connected to the computer, preferably using Wired Modems. -- Everything must be connected to the computer, preferably using Wired Modems.
local EXPECTED_BOILERS = 3 local EXPECTED_BOILERS = 3
@@ -76,39 +76,53 @@ local function findBoilerData(data, visited)
return nil return nil
end end
local function readHeatMode(readerName) local function readBoiler(readerName)
if not readerName then return "UNKNOWN" end if not readerName then return "MISSING", "UNKNOWN", colors.red end
local ok, data = pcall(peripheral.call, readerName, "getBlockData") local ok, data = pcall(peripheral.call, readerName, "getBlockData")
if not ok then return "ERROR" end if not ok then return "ERROR", "UNKNOWN", colors.red end
local boiler = findBoilerData(data) local boiler = findBoilerData(data)
if not boiler then return "UNKNOWN" end if not boiler then return "NO DATA", "UNKNOWN", colors.red end
local passive = getValueIgnoringCase(boiler, { "PassiveHeat", "passive" }) local passive = getValueIgnoringCase(boiler, { "PassiveHeat", "passive" })
local heat = tonumber(getValueIgnoringCase(boiler, local heat = tonumber(getValueIgnoringCase(boiler,
{ "Heat", "activeHeat", "actualHeat", "boilerLevel", "level" })) { "Heat", "activeHeat", "actualHeat" }))
local supply = tonumber(getValueIgnoringCase(boiler,
{ "Supply", "waterSupply", "gatheredSupply" }))
local engines = tonumber(getValueIgnoringCase(boiler,
{ "Engines", "attachedEngines" }))
local active = getValueIgnoringCase(boiler,
{ "Active", "isActive", "prevActive" })
if passive == true or passive == 1 then return "CAMPFIRE" end local heatMode
if heat and heat >= 18 then return "SUPERHEATED" end if passive == true or passive == 1 then
if heat and heat > 0 then return "HEATED" end heatMode = "CAMPFIRE"
return "COLD" elseif heat and heat >= 18 then
heatMode = "SUPERHEATED"
elseif heat and heat > 0 then
heatMode = "HEATED"
else
heatMode = "COLD"
end end
local function readBoiler(name, readerName) if active == nil then
if not name then local hasHeat = heatMode ~= "COLD"
return "MISSING", 0, "UNKNOWN", colors.red local hasWater = supply == nil or supply > 0
local hasEngines = engines == nil or engines > 0
active = hasHeat and hasWater and hasEngines
end end
local ok, speed = pcall(peripheral.call, name, "getSpeed") if active == true or active == 1 then
if not ok or type(speed) ~= "number" then return "ONLINE", heatMode, colors.lime
return "ERROR", 0, "UNKNOWN", colors.red end
return "STANDBY", heatMode, colors.orange
end end
speed = math.abs(speed) local function readMainSpeed(speedometerName)
if speed < 0.5 then if not speedometerName then return nil end
return "STANDBY", 0, readHeatMode(readerName), colors.orange local ok, speed = pcall(peripheral.call, speedometerName, "getSpeed")
end if not ok or type(speed) ~= "number" then return nil end
return "ONLINE", speed, readHeatMode(readerName), colors.lime return math.abs(speed)
end end
local function formatInteger(value) local function formatInteger(value)
@@ -147,28 +161,36 @@ local function render()
center(1, "CREATE KRAFTWERK", colors.cyan) center(1, "CREATE KRAFTWERK", colors.cyan)
local firstRow = 3 local firstRow = 3
for index = 1, EXPECTED_BOILERS do for index = 1, EXPECTED_BOILERS do
local state, speed, heatMode, color = readBoiler(speedometers[index], readers[index]) local state, heatMode, color = readBoiler(readers[index])
local row = firstRow + index - 1 local row = firstRow + index - 1
if row <= height then if row <= height then
center(row, ("BOILER %d %-7s %5.1f RPM %s") center(row, ("BOILER %d %-7s %s")
:format(index, state, speed, heatMode), color) :format(index, state, heatMode), color)
end end
end end
local speed = readMainSpeed(speedometers[1])
local capacity, usage, load = readMainShaft(stressometers[1]) local capacity, usage, load = readMainShaft(stressometers[1])
if height >= 7 then center(7, "MAIN SHAFT", colors.cyan) end if height >= 7 then center(7, "MAIN SHAFT", colors.cyan) end
if height >= 8 then
if speed then
center(8, ("Speed: %.1f RPM"):format(speed), speed > 0 and colors.lime or colors.orange)
else
center(8, "Speedometer nicht gefunden", colors.red)
end
end
if capacity then if capacity then
if height >= 8 then center(8, "Capacity: " .. formatInteger(capacity) .. " SU", colors.white) end if height >= 9 then center(9, "Capacity: " .. formatInteger(capacity) .. " SU", colors.white) end
if height >= 9 then center(9, "Usage: " .. formatInteger(usage) .. " SU", colors.white) end if height >= 10 then center(10, "Usage: " .. formatInteger(usage) .. " SU", colors.white) end
if height >= 10 then if height >= 11 then
local loadText = ("Load: %.1f %%"):format(load):gsub("%.", ",") local loadText = ("Load: %.1f %%"):format(load):gsub("%.", ",")
center(10, loadText, load >= 90 and colors.red or load >= 70 and colors.orange or colors.lime) center(11, loadText, load >= 90 and colors.red or load >= 70 and colors.orange or colors.lime)
end end
else else
if height >= 8 then center(8, "Stressometer nicht gefunden", colors.red) end if height >= 9 then center(9, "Stressometer nicht gefunden", colors.red) end
end end
if height >= 12 then if height >= 13 then
center(height, "Nur Anzeige - keine Steuerung", colors.gray) center(height, "Nur Anzeige - keine Steuerung", colors.gray)
end end