kpoppel
2013-07-02 053fa59739f4b772174bf0a090969b3395ab3f98
commit | author | age
cfb5bd 1 -- The HV down converter will step down HV EUs to MV EUs
K 2 -- If we take the solar panel as calibration then the
3 -- 1 HVEU = 5 MVEU as we stack 5 MV arrays to get a HV array.
4 -- The downconverter does of course have a conversion loss.
5 -- This loses 30% of the power.
6 -- The converter does not store any energy by itself.
7 minetest.register_node("technic:down_converter_hv", {
8         description = "HV Down Converter",
9     tiles  = {"technic_hv_down_converter_top.png", "technic_hv_down_converter_bottom.png", "technic_hv_down_converter_side.png",
10           "technic_hv_down_converter_side.png", "technic_hv_down_converter_side.png", "technic_hv_down_converter_side.png"},
11     groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
12     sounds = default.node_sound_wood_defaults(),
13     drawtype = "nodebox",
14     paramtype = "light",
15     is_ground_content = true,
16     node_box = {
17        type = "fixed",
18        fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
19     },
20     selection_box = {
21        type = "fixed",
22        fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
23     },
24     on_construct = function(pos)
25               local meta = minetest.env:get_meta(pos)
26               meta:set_float("technic_hv_power_machine", 1)
27               meta:set_float("technic_mv_power_machine", 1)
28               meta:set_float("internal_EU_buffer",0)
29               meta:set_float("internal_EU_buffer_size",0)
30               meta:set_string("infotext", "HV Down Converter")
31               meta:set_float("active", false)
32                end,
33      })
34
35 minetest.register_craft({
36     output = 'technic:down_converter_hv 1',
37     recipe = {
38         {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot','technic:stainless_steel_ingot'},
39         {'technic:hv_transformer',        'technic:hv_cable',             'technic:mv_transformer'},
40         {'technic:hv_cable',              'technic:rubber',               'technic:mv_cable'},
41     }
42 })
43
44 minetest.register_abm(
45     {nodenames = {"technic:down_converter_hv"},
46     interval   = 1,
47     chance     = 1,
48     action = function(pos, node, active_object_count, active_object_count_wider)
49             -- HV->MV conversion factor
50             local hv_mv_factor = 5
51             -- The maximun charge a single converter can handle. Let's set this to
52             -- what 5 HV solar arrays can produce - 30% loss (2880*5*0.7)
53             local max_charge = 10080*hv_mv_factor
54
55             local meta             = minetest.env:get_meta(pos)
56             local meta1            = nil
57             local pos1             = {}
58             local available_charge = 0 -- counted in MV units
59             local used_charge      = 0 -- counted in MV units
60
61             -- Index all HV nodes connected to the network
62             -- HV cable comes in through the bottom
63             pos1.y = pos.y-1
64             pos1.x = pos.x
65             pos1.z = pos.z
66             meta1  = minetest.env:get_meta(pos1)
67             if meta1:get_float("hv_cablelike")~=1 then return end
68
69             local HV_nodes    = {} -- HV type
70             local HV_PR_nodes = {} -- HV type
71             local HV_BA_nodes = {} -- HV type
72
73             HV_nodes[1]         = {}
74             HV_nodes[1].x       = pos1.x
75             HV_nodes[1].y       = pos1.y
76             HV_nodes[1].z       = pos1.z
77
78             local table_index = 1
79             repeat
80                check_HV_node(HV_PR_nodes,nil,HV_BA_nodes,HV_nodes,table_index)
81                table_index = table_index + 1
82                if HV_nodes[table_index] == nil then break end
83             until false
84
85             --print("HV_nodes: PR="..table.getn(HV_PR_nodes).." BA="..table.getn(HV_BA_nodes))
86
87             -- Index all MV nodes connected to the network
88             -- MV cable comes out of the top
89             pos1.y = pos.y+1
90             pos1.x = pos.x
91             pos1.z = pos.z
92             meta1  = minetest.env:get_meta(pos1)
93             if meta1:get_float("mv_cablelike")~=1 then return end
94
95             local MV_nodes    = {} -- MV type
96             local MV_RE_nodes = {} -- MV type
97             local MV_BA_nodes = {} -- MV type
98
99             MV_nodes[1]         = {}
100             MV_nodes[1].x       = pos1.x
101             MV_nodes[1].y       = pos1.y
102             MV_nodes[1].z       = pos1.z
103
104             table_index = 1
105             repeat
106                check_MV_node(nil,MV_RE_nodes,MV_BA_nodes,MV_nodes,table_index)
107                table_index = table_index + 1
108                if MV_nodes[table_index] == nil then break end
109             until false
110
111             --print("MV_nodes: RE="..table.getn(MV_RE_nodes).." BA="..table.getn(MV_BA_nodes))
112
113             -- First get available power from all the attached HV suppliers
114             -- Get the supplier internal EU buffer and read the EUs from it
115             -- No update yet!
116             local pos1
117 -- FIXME: Until further leave the producers out of it and just let the batteries be the hub
118 --            for _,pos1 in ipairs(HV_PR_nodes) do
119 --               meta1  = minetest.env:get_meta(pos1)
120 --               local internal_EU_buffer = meta1:get_float("internal_EU_buffer")
121 --               available_charge = available_charge + meta1:get_float("internal_EU_buffer") * hv_mv_factor
122 --               -- Limit conversion capacity
123 --               if available_charge > max_charge then
124 --              available_charge = max_charge
125 --              break
126 --               end
127 --            end
128 --            --print("Available_charge PR:"..available_charge)
129
130             for _,pos1 in ipairs(HV_BA_nodes) do
131                meta1  = minetest.env:get_meta(pos1)
132                local internal_EU_buffer = meta1:get_float("internal_EU_buffer")
133                available_charge = available_charge + meta1:get_float("internal_EU_buffer") * hv_mv_factor
134                -- Limit conversion capacity
135                if available_charge > max_charge then
136               available_charge = max_charge
137               break
138                end
139             end
140             --print("Available_charge PR+BA:"..available_charge)
141
142             -- Calculate total number of receivers:
143             local MV_receivers = table.getn(MV_RE_nodes)+table.getn(MV_BA_nodes)
144
145             -- Next supply power to all connected MV machines
146             -- Get the power receiver internal EU buffer and give EUs to it
147             -- Note: for now leave out RE type machines until producers distribute power themselves even without a battery
148 --            for _,pos1 in ipairs(MV_RE_nodes) do
149 --               local meta1                   = minetest.env:get_meta(pos1)
150 --               local internal_EU_buffer      = meta1:get_float("internal_EU_buffer")
151 --               local internal_EU_buffer_size = meta1:get_float("internal_EU_buffer_size")
152 --               local charge_to_give = math.min(4000, available_charge/MV_receivers) -- power rating limit on the MV wire
153 --               -- How much can this unit take?
154 --               if internal_EU_buffer+charge_to_give > internal_EU_buffer_size then
155 --              charge_to_give=internal_EU_buffer_size-internal_EU_buffer
156 --               end
157 --               -- If we are emptying the supply take the remainder
158 --               if available_charge<used_charge+charge_to_give then charge_to_give=available_charge-used_charge end
159 --               -- Update the unit supplied to
160 --               internal_EU_buffer = internal_EU_buffer + charge_to_give
161 --               meta1:set_float("internal_EU_buffer",internal_EU_buffer)
162 --               -- Do the accounting
163 --               used_charge = used_charge + charge_to_give
164 --               if available_charge == used_charge then break end -- bail out if supply depleted
165 --            end
166             --print("used_charge RE:"..used_charge)
167
168             for _,pos1 in ipairs(MV_BA_nodes) do
169                local meta1 = minetest.env:get_meta(pos1)
170                local internal_EU_buffer      = meta1:get_float("internal_EU_buffer")
171                local internal_EU_buffer_size = meta1:get_float("internal_EU_buffer_size")
172                --print("internal_EU_buffer:"..internal_EU_buffer)
173                --print("internal_EU_buffer_size:"..internal_EU_buffer_size)
174                local charge_to_give = math.min(math.floor(available_charge/MV_receivers), 4000) -- power rating limit on the MV wire
175                --print("charge_to_give:"..charge_to_give)
176                -- How much can this unit take?
177                if internal_EU_buffer+charge_to_give > internal_EU_buffer_size then
178               charge_to_give=internal_EU_buffer_size-internal_EU_buffer
179                end
180                --print("charge_to_give2:"..charge_to_give)
181                -- If we are emptying the supply take the remainder
182                if available_charge<used_charge+charge_to_give then charge_to_give=available_charge-used_charge end
183                -- Update the unit supplied to
184                --print("charge_to_give3:"..charge_to_give)
185                internal_EU_buffer = internal_EU_buffer + charge_to_give
186                --print("internal_EU_buffer:"..internal_EU_buffer)
187                meta1:set_float("internal_EU_buffer",internal_EU_buffer)
188                -- Do the accounting
189                used_charge = used_charge + charge_to_give
190                --print("used_charge:"..used_charge)
191                if available_charge == used_charge then break end -- bail out if supply depleted
192             end
193             --print("used_charge RE+BA:"..used_charge)
194
195             -- Last update the HV suppliers with the actual demand.
196             -- Get the supplier internal EU buffer and update the EUs from it
197             -- Note: So far PR nodes left out and only BA nodes are updated
198             local HV_BA_size = table.getn(HV_BA_nodes)
199             for _,pos1 in ipairs(HV_BA_nodes) do
200                meta1  = minetest.env:get_meta(pos1)
201                local internal_EU_buffer = meta1:get_float("internal_EU_buffer")
202                local charge_to_take = math.floor(used_charge/HV_BA_size/hv_mv_factor) -- HV units
203                if internal_EU_buffer-charge_to_take <= 0 then
204               charge_to_take = internal_EU_buffer
205                end
206                if charge_to_take > 0 then
207               internal_EU_buffer = internal_EU_buffer-charge_to_take
208               meta1:set_float("internal_EU_buffer",internal_EU_buffer)
209                end
210             end
211
212             if used_charge>0 then
213                meta:set_string("infotext", "HV Down Converter is active (HV:"..available_charge.."/MV:"..used_charge..")");
214                meta:set_float("active",1) -- used for setting textures someday maybe
215             else
216                meta:set_string("infotext", "HV Down Converter is inactive (HV:"..available_charge.."/MV:"..used_charge..")");
217                meta:set_float("active",0) -- used for setting textures someday maybe
218                return
219             end
220     end,
221 })
222
223 -- This machine does not store energy it receives energy from the HV side and outputs it on the MV side
224 register_HV_machine ("technic:down_converter_hv","RE")
225 register_MV_machine ("technic:down_converter_hv","PR")