| """Create a PowerPoint presentation for the solar system electrical plan โ v2 (Series topology).""" |
| from pptx import Presentation |
| from pptx.util import Inches, Pt, Cm, Emu |
| from pptx.dml.color import RGBColor |
| from pptx.enum.text import PP_ALIGN, MSO_ANCHOR |
| from pptx.enum.shapes import MSO_SHAPE |
| from pptx.oxml.ns import qn |
| import os |
|
|
| prs = Presentation() |
| prs.slide_width = Inches(13.333) |
| prs.slide_height = Inches(7.5) |
|
|
| |
| NAVY = RGBColor(0x0C, 0x23, 0x40) |
| BLUE = RGBColor(0x1A, 0x52, 0x76) |
| GOLD = RGBColor(0xF0, 0xC0, 0x40) |
| WHITE = RGBColor(0xFF, 0xFF, 0xFF) |
| LIGHT_BG = RGBColor(0xF5, 0xF6, 0xFA) |
| RED = RGBColor(0xC6, 0x28, 0x28) |
| ORANGE = RGBColor(0xE6, 0x51, 0x00) |
| GREEN = RGBColor(0x2E, 0x7D, 0x32) |
| TEAL = RGBColor(0x00, 0x89, 0x7B) |
| DARK_TEXT = RGBColor(0x1A, 0x1A, 0x2E) |
| GRAY = RGBColor(0x55, 0x55, 0x55) |
| LIGHT_GOLD = RGBColor(0xFF, 0xF8, 0xE1) |
| LIGHT_RED = RGBColor(0xFF, 0xEB, 0xEE) |
| LIGHT_GREEN = RGBColor(0xE8, 0xF5, 0xE9) |
| LIGHT_BLUE = RGBColor(0xE3, 0xF2, 0xFD) |
| LIGHT_ORANGE = RGBColor(0xFF, 0xF3, 0xE0) |
| PURPLE = RGBColor(0x7B, 0x5E, 0xA7) |
|
|
| |
| def set_slide_bg(slide, color): |
| bg = slide.background |
| fill = bg.fill |
| fill.solid() |
| fill.fore_color.rgb = color |
|
|
| def add_shape(slide, left, top, width, height, fill_color=None, line_color=None, shape_type=MSO_SHAPE.ROUNDED_RECTANGLE): |
| shape = slide.shapes.add_shape(shape_type, left, top, width, height) |
| shape.shadow.inherit = False |
| if fill_color: |
| shape.fill.solid() |
| shape.fill.fore_color.rgb = fill_color |
| else: |
| shape.fill.background() |
| if line_color: |
| shape.line.color.rgb = line_color |
| shape.line.width = Pt(1) |
| else: |
| shape.line.fill.background() |
| return shape |
|
|
| def set_text(shape, text, font_size=14, color=DARK_TEXT, bold=False, alignment=PP_ALIGN.RIGHT, font_name='Arial'): |
| tf = shape.text_frame |
| tf.word_wrap = True |
| tf.auto_size = None |
| p = tf.paragraphs[0] |
| p.alignment = alignment |
| run = p.add_run() |
| run.text = text |
| run.font.size = Pt(font_size) |
| run.font.color.rgb = color |
| run.font.bold = bold |
| run.font.name = font_name |
| pPr = p._p.get_or_add_pPr() |
| pPr.set('rtl', '1') |
| return tf |
|
|
| def add_text_box(slide, left, top, width, height, text, font_size=14, color=DARK_TEXT, bold=False, alignment=PP_ALIGN.RIGHT): |
| txBox = slide.shapes.add_textbox(left, top, width, height) |
| tf = txBox.text_frame |
| tf.word_wrap = True |
| p = tf.paragraphs[0] |
| p.alignment = alignment |
| pPr = p._p.get_or_add_pPr() |
| pPr.set('rtl', '1') |
| run = p.add_run() |
| run.text = text |
| run.font.size = Pt(font_size) |
| run.font.color.rgb = color |
| run.font.bold = bold |
| run.font.name = 'Arial' |
| return tf |
|
|
| def add_multiline_box(slide, left, top, width, height, lines, default_size=13, default_color=DARK_TEXT): |
| txBox = slide.shapes.add_textbox(left, top, width, height) |
| tf = txBox.text_frame |
| tf.word_wrap = True |
| for i, line_data in enumerate(lines): |
| text = line_data[0] |
| size = line_data[1] if len(line_data) > 1 else default_size |
| color = line_data[2] if len(line_data) > 2 else default_color |
| bold = line_data[3] if len(line_data) > 3 else False |
| align = line_data[4] if len(line_data) > 4 else PP_ALIGN.RIGHT |
| if i == 0: |
| p = tf.paragraphs[0] |
| else: |
| p = tf.add_paragraph() |
| p.alignment = align |
| pPr = p._p.get_or_add_pPr() |
| pPr.set('rtl', '1') |
| p.space_after = Pt(4) |
| run = p.add_run() |
| run.text = text |
| run.font.size = Pt(size) |
| run.font.color.rgb = color |
| run.font.bold = bold |
| run.font.name = 'Arial' |
| return tf |
|
|
| def add_table_slide(slide, left, top, width, row_height, headers, rows, header_bg=NAVY, header_fg=WHITE, highlight_rows=None, col_ratios=None): |
| num_rows = len(rows) + 1 |
| num_cols = len(headers) |
| table_shape = slide.shapes.add_table(num_rows, num_cols, left, top, width, Pt(row_height * num_rows)) |
| table = table_shape.table |
| if col_ratios: |
| total = sum(col_ratios) |
| for i, ratio in enumerate(col_ratios): |
| table.columns[i].width = int(width * ratio / total) |
| else: |
| col_width = int(width / num_cols) |
| for i in range(num_cols): |
| table.columns[i].width = col_width |
| for i, h in enumerate(headers): |
| cell = table.cell(0, i) |
| cell.text = h |
| cell.fill.solid() |
| cell.fill.fore_color.rgb = header_bg |
| for p in cell.text_frame.paragraphs: |
| p.alignment = PP_ALIGN.RIGHT |
| pPr = p._p.get_or_add_pPr() |
| pPr.set('rtl', '1') |
| for run in p.runs: |
| run.font.size = Pt(12) |
| run.font.color.rgb = header_fg |
| run.font.bold = True |
| run.font.name = 'Arial' |
| for r_idx, row in enumerate(rows): |
| for c_idx, val in enumerate(row): |
| cell = table.cell(r_idx + 1, c_idx) |
| cell.text = str(val) |
| if highlight_rows and r_idx in highlight_rows: |
| cell.fill.solid() |
| cell.fill.fore_color.rgb = LIGHT_GOLD |
| for p in cell.text_frame.paragraphs: |
| p.alignment = PP_ALIGN.RIGHT |
| pPr = p._p.get_or_add_pPr() |
| pPr.set('rtl', '1') |
| for run in p.runs: |
| run.font.size = Pt(11) |
| run.font.color.rgb = DARK_TEXT |
| run.font.name = 'Arial' |
| return table |
|
|
| def add_card(slide, left, top, width, height, title, body_lines, fill=WHITE, accent=GOLD): |
| bar = add_shape(slide, left, top, width, Pt(4), fill_color=accent, shape_type=MSO_SHAPE.RECTANGLE) |
| card = add_shape(slide, left, top + Pt(4), width, height - Pt(4), fill_color=fill, line_color=RGBColor(0xE0, 0xE4, 0xEA)) |
| add_text_box(slide, left + Pt(10), top + Pt(10), width - Pt(20), Pt(24), title, font_size=15, color=NAVY, bold=True) |
| add_multiline_box(slide, left + Pt(10), top + Pt(36), width - Pt(20), height - Pt(46), body_lines, default_size=11) |
|
|
| def section_header(slide, text, y=Inches(0.3)): |
| add_text_box(slide, Inches(0.5), y, Inches(12), Inches(0.7), text, font_size=28, color=NAVY, bold=True) |
| add_shape(slide, Inches(0.5), y + Inches(0.65), Inches(2), Pt(3), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| def add_block(slide, x, y, w, h, text, sub, fill, text_color=WHITE, sub_color=None): |
| shape = add_shape(slide, x, y, w, h, fill_color=fill) |
| tf = shape.text_frame |
| tf.word_wrap = True |
| tf.paragraphs[0].alignment = PP_ALIGN.CENTER |
| pPr = tf.paragraphs[0]._p.get_or_add_pPr() |
| pPr.set('rtl', '1') |
| run = tf.paragraphs[0].add_run() |
| run.text = text |
| run.font.size = Pt(12) |
| run.font.color.rgb = text_color |
| run.font.bold = True |
| run.font.name = 'Arial' |
| if sub: |
| p2 = tf.add_paragraph() |
| p2.alignment = PP_ALIGN.CENTER |
| pPr2 = p2._p.get_or_add_pPr() |
| pPr2.set('rtl', '1') |
| run2 = p2.add_run() |
| run2.text = sub |
| run2.font.size = Pt(9) |
| run2.font.color.rgb = sub_color or RGBColor(0xCC, 0xCC, 0xCC) |
| run2.font.name = 'Arial' |
|
|
| def add_checklist_col(slide, x_start, y_start, items): |
| """items = list of (task, detail)""" |
| y = y_start |
| for task, detail in items: |
| add_text_box(slide, x_start, y, Inches(5.5), Inches(0.2), task, font_size=11, color=DARK_TEXT, bold=True) |
| add_text_box(slide, x_start, y + Pt(14), Inches(5.5), Inches(0.15), detail, font_size=9, color=GRAY) |
| y += Inches(0.4) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, NAVY) |
|
|
| add_shape(slide, Inches(1), Inches(3.1), Inches(2), Pt(3), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| add_text_box(slide, Inches(1), Inches(1.2), Inches(11), Inches(1.5), |
| 'ืชืื ืืช ืืฉืืืืช โ ืืขืจืืช ืกืืืืจืืช ืืืืจืืืืช', font_size=40, color=WHITE, bold=True) |
| add_text_box(slide, Inches(1), Inches(2.4), Inches(11), Inches(0.6), |
| 'ืืืืช ืืืืจ โ ืืื ืกืคืจื', font_size=24, color=RGBColor(0xA8, 0xD8, 0xEA)) |
|
|
| meta_items = [ |
| 'ืืจืฅ 2026', |
| 'ืืืืจ: Solis S6-EH3P20K-H | 20kW ืชืืช-ืคืืื', |
| 'ืกืืืื: CNTE 18.8kWh HV | LiFePO4', |
| 'ืคืื ืืื: 18 x 620W = 11.16kWp', |
| 'Zero Export | ืืืคืืืืืื ืกืืจืชืืช | ืืื CT', |
| ] |
| add_multiline_box(slide, Inches(1), Inches(3.5), Inches(11), Inches(2.5), |
| [(m, 16, RGBColor(0xCD, 0xDE, 0xEE)) for m in meta_items]) |
|
|
| |
| add_shape(slide, Inches(0), Inches(7.1), Inches(13.333), Pt(30), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) |
| add_text_box(slide, Inches(1), Inches(7.12), Inches(11), Pt(26), |
| 'ืชืื ืื ืืืื โ ืืืืฉืืจ ืืฉืืืื ืืืกืื ืืคื ื ืืืฆืืข', font_size=12, color=NAVY, bold=True, alignment=PP_ALIGN.CENTER) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| add_text_box(slide, Inches(0.5), Inches(0.3), Inches(12), Inches(0.7), |
| 'ืืขืจืืช ืืฉืืืืช ืืคื ื ืืืฆืืข', font_size=28, color=ORANGE, bold=True) |
| add_shape(slide, Inches(0.5), Inches(0.95), Inches(2), Pt(3), fill_color=ORANGE, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| notes = [ |
| ('ืืืคืืืืืื ืกืืจืชืืช (Series)', |
| 'ืื ืืืฉืื ืขืืืจ ืืจื ืืืืืจ. ืืื CT. ืืื DC Isolators ืืืฆืื ืืื\n(ืืืื ืื ืืืืืจ ืืืกืืืื). ืืคืกืงื C40 ืืกืคืืงืื.', |
| 'ืืืืื ืขื ืืื ืืืชืงืื'), |
| ('RCD (ืคืืช)', |
| 'ืื ื ืืื ืืจืืข โ ืืืงืืข ืืคื ืืจืืฉืช ืืืืืง ืืืชืื ืืืืื ืืืจืงื.\nืืืืืฅ ืืฉืงืื ืืืกืคื ืืจืืฉ ืืืืืืืช.', |
| 'ื ืืื ืืฉืื ืืืืงื'), |
| ('ืืืขืช ืืื ืืืช ืืืื ืกืืืื', |
| 'ืืคื ืืืชืงืื, ืืื ืืกืืืื ืงืฆืจ ืืื ืืืคืฃ.\nื ืงืืื ืคืชืืื โ ืืืจืจ ืื CNTE ืืืื ferrite ืืืื ื, ืื ืืืฉืชืืฉ ืืืื ืืจืื ืืืชืจ.', |
| 'ื ืงืืื ืคืชืืื'), |
| ] |
|
|
| y = Inches(1.3) |
| for title, desc, status in notes: |
| card = add_shape(slide, Inches(0.5), y, Inches(12), Inches(1.4), fill_color=WHITE, line_color=RGBColor(0xE0, 0xA0, 0x00)) |
| add_shape(slide, Inches(0.5), y, Pt(6), Inches(1.4), fill_color=ORANGE, shape_type=MSO_SHAPE.RECTANGLE) |
| add_text_box(slide, Inches(0.8), y + Pt(8), Inches(9), Pt(24), title, font_size=16, color=ORANGE, bold=True) |
| add_text_box(slide, Inches(0.8), y + Pt(34), Inches(9), Pt(60), desc, font_size=12, color=GRAY) |
| |
| badge = add_shape(slide, Inches(10), y + Pt(14), Inches(2.2), Inches(0.35), fill_color=LIGHT_GOLD) |
| set_text(badge, status, font_size=11, color=ORANGE, bold=True, alignment=PP_ALIGN.CENTER) |
| y += Inches(1.6) |
|
|
| |
| box = add_shape(slide, Inches(0.5), Inches(6), Inches(12), Inches(0.8), fill_color=LIGHT_GREEN) |
| add_multiline_box(slide, Inches(0.7), Inches(6.05), Inches(11.6), Inches(0.7), [ |
| ('ืฉืื ืืืื ืขืืงืจืืื ืืืจืกื ืงืืืืช: ืืื DC Isolators ืืืฆืื ืืื (ืืืื ืื) | ืืื CT (series topology) | C40 ืืกืคืืง (ืื C50) | Zero Export ืืืืืืื | 3P ืืืจื ืืืจืจ ืืฆืืื', 12, GREEN, True, PP_ALIGN.CENTER), |
| ]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '1. ืชืจืฉืื ืื-ืงืืื (Single Line Diagram)') |
|
|
| |
| banner = add_shape(slide, Inches(0.5), Inches(1.1), Inches(12.3), Inches(0.4), fill_color=LIGHT_GREEN) |
| add_text_box(slide, Inches(0.7), Inches(1.12), Inches(12), Inches(0.35), |
| 'ืืืคืืืืืื ืกืืจืชืืช โ ืื ืืืฉืื ืขืืืจ ืืจื ืืืืืจ | Zero Export | ืืื CT', |
| font_size=13, color=GREEN, bold=True, alignment=PP_ALIGN.CENTER) |
|
|
| LINE_W = Pt(2.5) |
|
|
| def add_line_h(slide, x, y, length, color): |
| """Horizontal line (thin rectangle).""" |
| add_shape(slide, x, y, length, LINE_W, fill_color=color, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| def add_line_v(slide, x, y, length, color): |
| """Vertical line (thin rectangle).""" |
| add_shape(slide, x, y, LINE_W, length, fill_color=color, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| DC_PV_COLOR = RGBColor(0xF0, 0xC0, 0x40) |
| DC_BATT_COLOR = TEAL |
| AC_GRID_COLOR = RGBColor(0x15, 0x65, 0xC0) |
| AC_BACKUP_COLOR = ORANGE |
| AC_DIST_COLOR = RGBColor(0x45, 0x5A, 0x64) |
| BMS_COLOR = RGBColor(0x26, 0xA6, 0x9A) |
|
|
| |
| |
| s1_x, s1_y, s1_w, s1_h = 2.0, 1.7, 2.5, 0.65 |
| s2_x, s2_y, s2_w, s2_h = 8.5, 1.7, 2.5, 0.65 |
| |
| inv_x, inv_y, inv_w, inv_h = 4.5, 2.85, 4.2, 0.9 |
| |
| bat_x, bat_y, bat_w, bat_h = 0.5, 2.95, 2.3, 0.8 |
| |
| spd_x, spd_y, spd_w, spd_h = 5.1, 4.1, 1.8, 0.5 |
| |
| mcb_x, mcb_y, mcb_w, mcb_h = 7.2, 4.1, 1.5, 0.5 |
| |
| chg_x, chg_y, chg_w, chg_h = 5.4, 4.85, 2.5, 0.55 |
| |
| grid_x, grid_y, grid_w, grid_h = 2.5, 5.75, 2.0, 0.55 |
| |
| load_x, load_y, load_w, load_h = 8.5, 5.75, 2.0, 0.55 |
| |
| bkp_x, bkp_y, bkp_w, bkp_h = 10.5, 2.95, 2.2, 0.8 |
|
|
| |
| str_w_in = Inches(s1_w) |
| add_block(slide, Inches(s1_x), Inches(s1_y), str_w_in, Inches(s1_h), |
| 'String 1: 9x620W = 5,580Wp', 'Vocโ396V | Iscโ18A | MPPT1', |
| DC_PV_COLOR, DARK_TEXT, GRAY) |
| add_block(slide, Inches(s2_x), Inches(s2_y), str_w_in, Inches(s2_h), |
| 'String 2: 9x620W = 5,580Wp', 'Vocโ396V | Iscโ18A | MPPT2', |
| DC_PV_COLOR, DARK_TEXT, GRAY) |
|
|
| add_text_box(slide, Inches(4.5), Inches(2.45), Inches(4), Inches(0.25), |
| 'DC switch ืืืื ื ืืืืืจ โ ืืื DC Isolator ืืืฆืื ื', |
| font_size=10, color=GRAY, alignment=PP_ALIGN.CENTER) |
|
|
| add_block(slide, Inches(inv_x), Inches(inv_y), Inches(inv_w), Inches(inv_h), |
| 'Solis S6-EH3P20K-H', 'Hybrid 20kW | 3ฯ | IP66 | Series | DC switch + AFCI ืืืื ืื', |
| NAVY, WHITE, RGBColor(0xA8, 0xD8, 0xEA)) |
|
|
| add_block(slide, Inches(bat_x), Inches(bat_y), Inches(bat_w), Inches(bat_h), |
| 'CNTE 18.8kWh', 'HV | LFP | IP66 | DC switch ืืืื ื', |
| RGBColor(0xE0, 0xF2, 0xF1), DARK_TEXT, GRAY) |
|
|
| add_block(slide, Inches(spd_x), Inches(spd_y), Inches(spd_w), Inches(spd_h), |
| 'SPD Type 2', '3P+N | 40kA', |
| LIGHT_RED, RED, GRAY) |
|
|
| add_block(slide, Inches(mcb_x), Inches(mcb_y), Inches(mcb_w), Inches(mcb_h), |
| 'MCB C40 4P', 'ืืฆืืืช ืืืืจ', |
| RGBColor(0xED, 0xE7, 0xF6), DARK_TEXT, GRAY) |
|
|
| add_block(slide, Inches(chg_x), Inches(chg_y), Inches(chg_w), Inches(chg_h), |
| 'ืืืจืจ ืืฆืืื Hager 4P 40A', 'Grid / Solar / Off', |
| RGBColor(0xF3, 0xE5, 0xF5), DARK_TEXT, GRAY) |
|
|
| add_block(slide, Inches(grid_x), Inches(grid_y), Inches(grid_w), Inches(grid_h), |
| 'MCB C40 3P โ ืืื ื ืืืฉืื', 'ืจืฉืช ืืฉืื', |
| RGBColor(0xEC, 0xEF, 0xF1), DARK_TEXT, GRAY) |
|
|
| add_block(slide, Inches(load_x), Inches(load_y), Inches(load_w), Inches(load_h), |
| 'MCB C40 3P โ ืืื ืืฉืืื', 'ืขืืืกื ืืืืช', |
| LIGHT_GREEN, DARK_TEXT, GRAY) |
|
|
| add_block(slide, Inches(bkp_x), Inches(bkp_y), Inches(bkp_w), Inches(bkp_h), |
| 'ืขืืืกืื ืืืื ืืื', 'Backup UPS <10ms | C40 3P', |
| LIGHT_ORANGE, DARK_TEXT, GRAY) |
|
|
| |
|
|
| |
| s1_cx = s1_x + s1_w / 2 |
| s1_bot = s1_y + s1_h |
| add_line_v(slide, Inches(s1_cx), Inches(s1_bot), Inches(0.25), DC_PV_COLOR) |
|
|
| |
| s2_cx = s2_x + s2_w / 2 |
| s2_bot = s2_y + s2_h |
| add_line_v(slide, Inches(s2_cx), Inches(s2_bot), Inches(0.25), DC_PV_COLOR) |
|
|
| |
| merge_y = 2.6 |
| add_line_h(slide, Inches(s1_cx), Inches(merge_y), Inches(s2_cx - s1_cx), DC_PV_COLOR) |
|
|
| |
| inv_cx = inv_x + inv_w / 2 |
| add_line_v(slide, Inches(inv_cx), Inches(merge_y), Inches(inv_y - merge_y), DC_PV_COLOR) |
|
|
| |
| bat_right = bat_x + bat_w |
| bat_cy = bat_y + bat_h / 2 |
| add_line_h(slide, Inches(bat_right), Inches(bat_cy), Inches(inv_x - bat_right), DC_BATT_COLOR) |
|
|
| |
| add_text_box(slide, Inches(3.0), Inches(3.05), Inches(1.3), Inches(0.2), |
| 'DC HV + CAN/BMS', font_size=9, color=BMS_COLOR, alignment=PP_ALIGN.CENTER) |
|
|
| |
| inv_bot = inv_y + inv_h |
| spd_cx = spd_x + spd_w / 2 |
| spd_cy = spd_y + spd_h / 2 |
| spd_right = spd_x + spd_w |
| mcb_cx = mcb_x + mcb_w / 2 |
| mcb_bot = mcb_y + mcb_h |
| chg_cx = chg_x + chg_w / 2 |
| chg_top = chg_y |
|
|
| |
| elbow_y = inv_bot + 0.08 |
| add_line_v(slide, Inches(inv_cx), Inches(inv_bot), Inches(elbow_y - inv_bot), AC_GRID_COLOR) |
|
|
| |
| add_line_h(slide, Inches(spd_cx), Inches(elbow_y), Inches(inv_cx - spd_cx), AC_GRID_COLOR) |
|
|
| |
| add_line_v(slide, Inches(spd_cx), Inches(elbow_y), Inches(spd_y - elbow_y), AC_GRID_COLOR) |
|
|
| |
| add_line_h(slide, Inches(spd_right), Inches(spd_cy), Inches(mcb_x - spd_right), AC_GRID_COLOR) |
|
|
| |
| elbow2_y = mcb_bot + 0.05 |
| add_line_v(slide, Inches(mcb_cx), Inches(mcb_bot), Inches(elbow2_y - mcb_bot), AC_GRID_COLOR) |
|
|
| |
| add_line_h(slide, Inches(chg_cx), Inches(elbow2_y), Inches(mcb_cx - chg_cx), AC_GRID_COLOR) |
|
|
| |
| add_line_v(slide, Inches(chg_cx), Inches(elbow2_y), Inches(chg_top - elbow2_y), AC_GRID_COLOR) |
|
|
| |
| chg_bot = chg_y + chg_h |
| branch_y = 5.55 |
| add_line_v(slide, Inches(chg_cx), Inches(chg_bot), Inches(branch_y - chg_bot), AC_DIST_COLOR) |
|
|
| |
| grid_cx = grid_x + grid_w / 2 |
| load_cx = load_x + load_w / 2 |
| add_line_h(slide, Inches(grid_cx), Inches(branch_y), Inches(load_cx - grid_cx), AC_DIST_COLOR) |
|
|
| |
| add_line_v(slide, Inches(grid_cx), Inches(branch_y), Inches(grid_y - branch_y), AC_DIST_COLOR) |
|
|
| |
| add_line_v(slide, Inches(load_cx), Inches(branch_y), Inches(load_y - branch_y), AC_DIST_COLOR) |
|
|
| |
| inv_right = inv_x + inv_w |
| inv_cy = inv_y + inv_h / 2 |
| bkp_left = bkp_x |
| bkp_cy = bkp_y + bkp_h / 2 |
| |
| add_line_h(slide, Inches(inv_right), Inches(inv_cy), Inches(bkp_left - inv_right), AC_BACKUP_COLOR) |
|
|
| |
| add_text_box(slide, Inches(inv_right + 0.1), Inches(inv_cy - 0.25), Inches(1.5), Inches(0.2), |
| 'Backup AC | UPS <10ms', font_size=9, color=AC_BACKUP_COLOR, alignment=PP_ALIGN.CENTER) |
|
|
| |
| legend_y = Inches(6.55) |
| legend_items = [ |
| (0.5, DC_PV_COLOR, 'DC PV'), |
| (2.2, DC_BATT_COLOR, 'DC Battery'), |
| (4.2, AC_GRID_COLOR, 'AC Grid'), |
| (6.0, AC_BACKUP_COLOR, 'AC Backup'), |
| (8.0, AC_DIST_COLOR, 'Distribution'), |
| (10.2, BMS_COLOR, 'BMS'), |
| ] |
| legend_bg = add_shape(slide, Inches(0.3), legend_y - Pt(4), Inches(12.7), Inches(0.4), fill_color=RGBColor(0xF5, 0xF5, 0xF5), line_color=RGBColor(0xE0, 0xE0, 0xE0)) |
| for lx, lcolor, ltext in legend_items: |
| add_shape(slide, Inches(lx), legend_y + Pt(4), Inches(0.4), Pt(3), fill_color=lcolor, shape_type=MSO_SHAPE.RECTANGLE) |
| add_text_box(slide, Inches(lx + 0.45), legend_y - Pt(2), Inches(1.3), Inches(0.3), |
| ltext, font_size=10, color=GRAY, alignment=PP_ALIGN.LEFT) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '2. ืจืฉืืืช ืจืืืืื ืืคืืจืืช') |
|
|
| components = [ |
| ('1', 'ืคืื ืืื ืกืืืืจืืื', '620W โ ืืง"ื s620', '18', 'ืื', '2 ืกืืจืื ืืื x 9. DC switch ืืืื ื ืืืืืจ'), |
| ('2', 'ืืืืจ ืืืืจืืื', 'Solis S6-EH3P20K-H', '1', 'ืงืืจ ืืืฆื', 'IP66. DC switch + AFCI ืืืื ืื'), |
| ('3', 'ืกืืืื', 'CNTE 18.8kWh HV', '1', 'ืืื ืืืืืจ', 'IP66. DC switch ืืืื ื. CAN'), |
| ('4', 'ืืื ืืจืงืื SPD', 'Type 2, 3P+N, 40kA', '1', 'ืืฆืืืช AC ืืืืจ', 'ืืื ืช AC'), |
| ('5', 'ืืคืกืง ืืฆืืืช ืืืืจ', 'ABB C40 4P', '1', 'ืืืจื SPD', '4P โ ืืืื ื ืืืืจื'), |
| ('6', 'ืืืจืจ ืืฆืืื', 'Hager 4P 40A', '1', 'ืืคื ื ืืชืคืฆืืืช', 'Grid / Solar / Off'), |
| ('7', 'ืืคืกืง ืจืฉืช', 'ABB C40 3P', '1', 'ืขื ืฃ ืจืฉืช', '3P โ ืืืจื ืืืจืจ'), |
| ('8', 'ืืคืกืง ืขืืืกืื', 'ABB C40 3P', '1', 'ืขื ืฃ ืขืืืกืื', '3P โ ืืืจื ืืืจืจ'), |
| ('9', 'ืืคืกืง ืืืืื', 'ABB C40 3P', '1', 'Backup ืืืืจ', '3P โ ืขืืืกืื ืืืื ืืื'), |
| ('10', 'ืืื ื ืืืฉืื', 'ืื-ืืืืื ื', '1', 'ืืคื ื ืืจืฉืช', 'ืืกืืคืง ืข"ื ืืืฉืื'), |
| ] |
|
|
| add_table_slide(slide, Inches(0.3), Inches(1.2), Inches(12.7), 30, |
| ['#', 'ืจืืื', 'ืืื / ืืคืจื', 'ืืืืช', 'ืืืงืื', 'ืืขืจืืช'], |
| components, highlight_rows=[3], |
| col_ratios=[0.5, 2, 2.5, 0.7, 1.5, 3]) |
|
|
| |
| note = add_shape(slide, Inches(0.3), Inches(5.8), Inches(12.7), Inches(0.7), fill_color=LIGHT_BLUE) |
| add_multiline_box(slide, Inches(0.5), Inches(5.85), Inches(12.3), Inches(0.6), [ |
| ('ืื ื ืืจืฉืื: DC Isolators ืืืฆืื ืืื (ืืืื ืื ืืืืืจ ืืืกืืืื) | CT ืืืืฉื ืืจื (Series topology = Zero Export ืืืืืืื) | C50 (C40 ืืกืคืืง)', 12, BLUE, True, PP_ALIGN.CENTER), |
| ]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '3. ืืคืจื ืืืืื') |
|
|
| cables = [ |
| ('PV String โ Inverter', 'H1Z2Z2-K ืกืืืืจื', '6mmยฒ', 'ืืคื ืืืงืื ืื', 'ืืฉืืจืืช ืืืืืจ, MC4, UV-resistant'), |
| ('Inverter โ Battery', 'DC ืืืืฉ', '16mmยฒ', '~3m', 'ืืืืข ืขื ืืฆืืื. โ ferrite โ ื ืงืืื ืคืชืืื'), |
| ('Inverter โ SPD โ MCB', 'NYY-J 5G AC', '10mmยฒ', '~5m', '3L + N + PE'), |
| ('MCB โ Switch โ Grid/Load', 'NYY-J 5G AC', '10mmยฒ', '~10m', 'ืืคื ืืจืืง ืืืื'), |
| ('Backup โ MCB โ Essential', 'NYY-J 5G AC', '6mmยฒ', '~8m', '3P ืขืืืกืื ืืืื ืืื'), |
| ('ืืืจืงื', 'ืืจืืง-ืฆืืื', '16mmยฒ ื ืืืฉืช', 'โ', 'ืืืืจ+ืกืืืื+ืืื ื'), |
| ('BMS Communication', 'CAN ืืกืืื', 'ืฉืืืจ', '~3m', 'ืืืืข ืืืืคืฃ ืืจืืฉ ืืืืขืช ืืื ืืืช'), |
| ] |
|
|
| add_table_slide(slide, Inches(0.5), Inches(1.2), Inches(12.3), 30, |
| ['ืงืืข', 'ืกืื ืืื', 'ืืชื', 'ืืืจื', 'ืืขืจืืช'], |
| cables, highlight_rows=[1], |
| col_ratios=[2.5, 2, 1.2, 1, 3.5]) |
|
|
| |
| note = add_shape(slide, Inches(0.5), Inches(4.5), Inches(12.3), Inches(0.9), fill_color=LIGHT_GOLD) |
| add_multiline_box(slide, Inches(0.7), Inches(4.55), Inches(12), Inches(0.8), [ |
| ('ืืืขืืช ืืื ืืืืช (Ferrite Rings):', 13, ORANGE, True), |
| ('ืืื CAN โ ืืืืข ืืืืคืฃ ืืจืืฉ (ืืคื ืืืชืงืื)', 12, DARK_TEXT), |
| ('ืืื DC ืกืืืื โ ืืืชืงืื ืืฆืืื ืฉืืื ืงืฆืจ ืืื ืืืคืฃ. ื ืงืืื ืคืชืืื โ ืืืจืจ ืืื CNTE ืื ืืฉ ferrite ืืืื ื, ืื ืืกืคืง ืืื ืืจืื ืืืชืจ', 12, ORANGE, True), |
| ]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '4. ืื ืืืืช ืืชืงื ื') |
|
|
| card_w = Inches(5.9) |
| card_h = Inches(2.5) |
|
|
| add_card(slide, Inches(0.5), Inches(1.2), card_w, card_h, |
| 'ืืืงืื ืืืืจ ืืกืืืื', [ |
| ('โข ืงืืจ ืืืฆื โ ืืื ื ืืฉืืฉ ืืฉืืจื', 12, DARK_TEXT), |
| ('โข ืืืื ืืื ืืืื 60 ืก"ื ืืืงืจืงืข', 12, DARK_TEXT), |
| ('โข ืืจืืื ืืืืจืืจ: 30 ืก"ื ืืฆืืืื, 50 ืก"ื ืืืืขืื', 12, DARK_TEXT), |
| ('โข ื ืืืฉ ืืชืืืืงื', 12, DARK_TEXT), |
| ('โข IP66 โ ืืชืืื ืืืืฅ', 12, GREEN), |
| ], accent=BLUE) |
|
|
| add_card(slide, Inches(6.8), Inches(1.2), card_w, card_h, |
| 'ืืืจืงื', [ |
| ('โข ืืืฃ ืืืืจ + ืืืฃ ืกืืืื', 12, DARK_TEXT), |
| ('โข ืืื ื ืงืื ืกืืจืืงืฆืื', 12, DARK_TEXT), |
| ('โข ืืกืืจืืช ืคืื ืืื', 12, DARK_TEXT), |
| ('โข ืืชื ืืื ืืืื: 16mmยฒ ื ืืืฉืช', 12, DARK_TEXT), |
| ('โข ืคืก ืืืจืงื โ ืืืงืืจืืื', 12, DARK_TEXT), |
| ], accent=GREEN) |
|
|
| add_card(slide, Inches(0.5), Inches(4.0), card_w, card_h, |
| 'ืืืืืจ ืกืืืื', [ |
| ('โข ืืื DC + ืืื CAN ืืืืขืื ืขื ืืฆืืื', 12, DARK_TEXT), |
| ('โข ืืื CAN ืืืืคืฃ ืืจืืฉ ืืืืขืช ืืื ืืืช', 12, DARK_TEXT), |
| ('โข ืืื DC โ ืงืฆืจ ืืื ืืืคืฃ (ื ืงืืื ืคืชืืื)', 12, ORANGE, True), |
| ('โข ืืืื ื ืืืืืง: 24.5 Nยทm', 12, DARK_TEXT), |
| ('โข ืืืืื ืงืืืืืืช ืืคื ื ืืืืืจ!', 12, RED, True), |
| ], accent=TEAL) |
|
|
| add_card(slide, Inches(6.8), Inches(4.0), card_w, card_h, |
| 'ืืืจืืืช ืืฉืืจืืช', [ |
| ('โข Solis โ RCS Solar ืืข"ื', 12, DARK_TEXT), |
| ('โข CNTE/Yoshopo โ RCS Solar ืืข"ื', 12, DARK_TEXT), |
| ('โข 10 ืฉื ืื ืขื ืืืืจ ืืกืืืื', 12, DARK_TEXT), |
| ('โข ืืชืงื ืช ืคืื ืืื โ ืืืืจืืืช ืืืงืื', 12, DARK_TEXT), |
| ], accent=GOLD) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| add_text_box(slide, Inches(0.5), Inches(0.3), Inches(12), Inches(0.7), |
| '5. ืืงืจืช ืืืืืช โ ื ืงืืืืช ืคืชืืืืช', font_size=28, color=ORANGE, bold=True) |
| add_shape(slide, Inches(0.5), Inches(0.95), Inches(2), Pt(3), fill_color=ORANGE, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| open_items = [ |
| ('Q1', 'RCD (ืคืืช)', 'ืืืชืงืื: ืื ืฉืืื ืืจืืข. ืืืกืืคื RCBO ืื ืืืืืง ืืืจืืฉ', 'ื ืืื ืืืืืงื. ืืืืืฅ ืืจืืฉ'), |
| ('Q2', 'AFCI', 'ืืืื ื ืืกืืืืก ืืฆื DC, ืืืจืฉ ืืคืขืื ืืื ืืช', 'ืืืืื activation ืืืชืงื ื'), |
| ('Q3', 'SPD DC ืืกืจ', 'SPD ืืฆื AC ืืืื. ืคืื ืืื ืืฉืืคืื ืืืจืง ืืฆื DC', 'ืืฉืงืื SPD DC 1000Vdc'), |
| ('Q4', 'Ferrite ืืืื ืกืืืื', 'ืืื DC ืงืฆืจ ืืื ืืืคืฃ. CAN ืืืืคืฃ ืืจืืฉ', 'ืืืจืจ ืืื CNTE โ ื ืงืืื ืคืชืืื'), |
| ] |
|
|
| add_table_slide(slide, Inches(0.5), Inches(1.2), Inches(12.3), 34, |
| ['#', 'ืืืฆื', 'ืืฆื', 'ืคืขืืื ื ืืจืฉืช'], |
| open_items, highlight_rows=[0, 1, 2, 3], |
| col_ratios=[0.5, 1.5, 4, 3]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| add_text_box(slide, Inches(0.5), Inches(0.3), Inches(12), Inches(0.7), |
| '5. ืืงืจืช ืืืืืช โ ืคืจืืืื ืชืงืื ืื', font_size=28, color=GREEN, bold=True) |
| add_shape(slide, Inches(0.5), Inches(0.95), Inches(2), Pt(3), fill_color=GREEN, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| verified = [ |
| ('ืืืคืืืืืื', 'ืกืืจืชืืช (Series) โ ืืื CT. C40 ืืกืคืืง', 'ืืืฉืจ ืข"ื ืืชืงืื โ'), |
| ('Voc ืกืืจืื ื', '396V < 1000V, ืืชืื MPPT 200โ850V', 'โ ืชืงืื'), |
| ('Isc ืกืืจืื ื', '~18A < 20A ืืงืกืืืื', 'โ ืชืงืื'), |
| ('ืืชืืืช ืกืืืื', 'CNTE HV 120โ800V = ืกืืืืก 120โ800V', 'โ ืชืงืื'), |
| ('ืืจื ืกืืืื', '50A = ืกืืืืก 50A max', 'โ ืชืงืื'), |
| ('IP Rating', 'ืืืืจ IP66 + ืกืืืื IP66', 'โ ืชืงืื'), |
| ('ืชืงืฉืืจืช BMS', 'CAN/RS485 ืชืืื', 'โ ืชืงืื'), |
| ('DC Switch ืืืื ื', 'ืืืืจ + ืกืืืื โ ืื ืฆืจืื ืืืฆืื ื', 'ืืืฉืจ ืข"ื ืืชืงืื โ'), |
| ('ืืคืกืงื C40', 'ืืกืืจืชื ืืืืืจ ืื ืืืฉื ืืขืืจ ืืฆืจืืื (3x40A)', 'ืืืฉืจ ืข"ื ืืชืงืื โ'), |
| ('ืงืืืื', 'ืืฆืืืช ืืืืจ: 4P. ืืืจื ืืืจืจ: 3P. Backup: 3P', 'ืืืฉืจ ืข"ื ืืชืงืื โ'), |
| ('Zero Export', 'ืืกืืจืชื โ ืืืืืืื, ืืื CT', 'ืืืฉืจ ืข"ื ืืชืงืื โ'), |
| ('ืืขืื ืช ืกืืืื', 'ืืกืืืืจื ืืืื โ ืื ืืืจืฉืช', 'ืืืฉืจ ืข"ื ืืชืงืื โ'), |
| ] |
|
|
| add_table_slide(slide, Inches(0.5), Inches(1.2), Inches(12.3), 28, |
| ['ืคืจืื', 'ืืืืงื', 'ืชืืฆืื'], |
| verified, col_ratios=[1.5, 4, 2]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '6. ืื ืืืืช ืืืฆืืข โ ืฉืื ื\'+ื\'') |
|
|
| |
| warn = add_shape(slide, Inches(0.5), Inches(1.1), Inches(12.3), Inches(0.5), fill_color=LIGHT_RED) |
| add_text_box(slide, Inches(0.7), Inches(1.15), Inches(12), Inches(0.4), |
| 'ืื ืืขืืืื ืืืฉืืืืช ืืืืืช ืืืชืืฆืข ืขื ืืื ืืฉืืืื ืืืกืื. ืขืืืื ืขื DC ืืืื (ืขื 800V) ืืกืืื ืช!', |
| font_size=12, color=RED, bold=True) |
|
|
| add_text_box(slide, Inches(0.5), Inches(1.7), Inches(6), Inches(0.4), |
| 'ืฉืื ื\' โ ืืื ื ืืจืืฉ', font_size=16, color=NAVY, bold=True) |
|
|
| add_checklist_col(slide, Inches(0.7), Inches(2.1), [ |
| ('โ ืืืฉืืจ ืชืื ืืช ืืื ืืฉืืืื', 'ืืชืืื ืืชืงื ืืช ืืืืจืืฉืืช ืืืืฉืื'), |
| ('โ ืจืืฉ ืจืืืืื ืืกืจืื', 'ABB C40 4P x1, ABB C40 3P x3, SPD AC Type 2, Hager 4P 40A'), |
| ('โ ืจืืฉ ืืืืื', 'H1Z2Z2-K 6mmยฒ, NYY-J 5G10, ืืืจืงื 16mmยฒ. DC+CAN ืืืืขืื ืขื ืืฆืืื'), |
| ('โ ืกืืืื ืืืงืื', 'ืงืืจ ืืืฆื, ืืืื 60+, ืืืืจืืจ 30/50 ืก"ื, ื ืืืฉ ืืชืืืืงื'), |
| ]) |
|
|
| add_text_box(slide, Inches(6.8), Inches(1.7), Inches(6), Inches(0.4), |
| 'ืฉืื ื\' โ ืืชืงื ื ืืื ืืช', font_size=16, color=NAVY, bold=True) |
|
|
| add_checklist_col(slide, Inches(7), Inches(2.1), [ |
| ('โ ืงืื ืกืืจืืงืฆืื ืขื ืืื', 'ืืกืืืืช, ืืฆืืืืช ืจืื, ืฉืืคืืข, ืืืืื'), |
| ('โ ืืจืืืช 18 ืคืื ืืื', '2 ืกืืจืื ืืื x 9, ืืืืืจ ืืืจื, ืืืจืงืช ืืกืืจืืช'), |
| ('โ ืืชืงื ืช ืืืืจ', 'Solis S6-EH3P20K-H โ ืชืืืื + ืืคืืก'), |
| ('โ ืืชืงื ืช ืกืืืื', 'CNTE 18.8kWh โ ืืืืืง ืงืืจ (~100 ืง"ื)'), |
| ('โ ืืื ืืคืกืงืื', 'ืืคืกืงืื, SPD, ืืืจืจ ืืฆืืื. ืกืืืื ืืจืืจ'), |
| ]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '6. ืื ืืืืช ืืืฆืืข โ ืฉืื ื\'+ื\'') |
|
|
| add_text_box(slide, Inches(0.5), Inches(1.1), Inches(6), Inches(0.4), |
| 'ืฉืื ื\' โ ืืืืื ืืืืืืจืื', font_size=16, color=NAVY, bold=True) |
|
|
| add_checklist_col(slide, Inches(0.7), Inches(1.5), [ |
| ('โ DC ืคืื ืืื โ ืืืืจ', 'H1Z2Z2-K 6mmยฒ, MC4. ืืฉืืจืืช ืืืืืจ. ืืืืื ืงืืืืืืช!'), |
| ('โ DC ืกืืืื', 'ืืื ืืืืข ืขื ืืฆืืื. ืืืื ื 24.5 Nยทm. ืืืืงืช ืงืืืืืืช!'), |
| ('โ BMS/CAN', 'ืืืืข ืืืืคืฃ ืืจืืฉ ืืืืขืช ืืื ืืืช'), |
| ('โ AC Grid', 'NYY-J 5G10 โ SPD โ MCB C40 4P โ ืืืจืจ โ ืืชืคืฆืืืช'), |
| ('โ AC Backup', 'NYY-J 5G10 โ MCB C40 3P โ ืขืืืกืื ืืืื ืืื'), |
| ('โ ืืืืืจ ืจืฉืช', 'ืืืจืจ โ MCB C40 3P โ ืืื ื โ ืจืฉืช'), |
| ('โ ืืืจืงื', '16mmยฒ Cu: ืืืืจ+ืกืืืื+ืืื ื+ืคืื ืืื โ ืืืงืืจืืื'), |
| ]) |
|
|
| add_text_box(slide, Inches(6.8), Inches(1.1), Inches(6), Inches(0.4), |
| 'ืฉืื ื\' โ ืืืืงืืช ืืคื ื ืืคืขืื', font_size=16, color=NAVY, bold=True) |
|
|
| add_checklist_col(slide, Inches(7), Inches(1.5), [ |
| ('โ Voc ืกืืจืื ื', '~396V ยฑ5%, ืืคืจืฉ <5% ืืื ืกืืจืื ืืื'), |
| ('โ Isc ืกืืจืื ื', '~18A ืืฉืืฉ ืืืื, ืืืื DC rated'), |
| ('โ ืงืืืืืืช DC', '+ ื-+, โ ื-โ. ืืืืืจ ืืคืื = ืืจืก ืืืืจ!'), |
| ('โ ืืืืื DC', 'ืืืจ: >1Mฮฉ ืืื +/โ ืืืืื'), |
| ('โ ืจืฆืืคืืช ืืืจืงื', '<0.5ฮฉ ืืื ืืกืืจืช ืืคืก ืืืจืงื'), |
| ('โ ืืชื ืกืืืื', '120โ800V, SOC ืืื ืืืื ~20%'), |
| ('โ ืชืงืฉืืจืช BMS', 'ืืืืจ ืืืื ืกืืืื, SOC/ืืชื/ืืืค\''), |
| ('โ ืืคืกืงืื', 'ืืคืขืื/ื ืืชืืง ืืื ื ืฉื ืื ืืคืกืง'), |
| ('โ ืืชื AC', '~400V ืืื ืคืืืืช, ~230V ืคืืื-ื ืืืืจื'), |
| ]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, LIGHT_BG) |
|
|
| section_header(slide, '6. ืื ืืืืช ืืืฆืืข โ ืฉืื ื\'+ื\'') |
|
|
| add_text_box(slide, Inches(0.5), Inches(1.1), Inches(6), Inches(0.4), |
| 'ืฉืื ื\' โ ืืคืขืื ืจืืฉืื ื (Commissioning)', font_size=16, color=NAVY, bold=True) |
|
|
| add_checklist_col(slide, Inches(0.7), Inches(1.5), [ |
| ('โ ืืคืขืื ืืคื ืกืืจ', '1. DC switch ืกืืืื โ 2. DC switch ืืืืจ (PV) โ 3. AC โ 4. ืืืืจ'), |
| ('โ ืืืืจืืช ืืืืจ', 'BT+APP: ืกืื ืกืืืื (Lithium/CAN), ืืฆื: Zero Export, ืชืืจ, ืืชื'), |
| ('โ ืืคืขืืช AFCI', 'activation required โ ืืื ืช ืงืฉืช DC'), |
| ('โ ืืืืจืช Zero Export', 'ืืืืื ืฉืืื ืืืฆืื ืืจืฉืช. ืืืืื ืฉืืืืจ ืืืจืื ืืืฆืืจ ืืฉืืื ืฆืจืืื'), |
| ('โ ืืืืงืช Backup', 'ื ืืชืืง ืจืฉืช โ ืขืืืกืื ืืืื ืืื ืขืืืืื <10ms'), |
| ('โ WiFi/Ethernet', 'ืืืืืจ ืื ืืืืจ โ SolisCloud'), |
| ('โ ื ืืืืจ 24 ืฉืขืืช', 'ืืืฆืืจ, ืืขืื ื, ืฆืจืืื, ืืืืื. ืืืืื Zero Export!'), |
| ]) |
|
|
| add_text_box(slide, Inches(6.8), Inches(1.1), Inches(6), Inches(0.4), |
| 'ืฉืื ื\' โ ืกืืืื ืืชืืขืื', font_size=16, color=NAVY, bold=True) |
|
|
| add_checklist_col(slide, Inches(7), Inches(1.5), [ |
| ('โ ืกืืืื ืืคืกืงืื', '"PV 1", "PV 2", "ืกืืืื", "AC", "ืจืฉืช", "ืขืืืกืื", "Backup"'), |
| ('โ ืฉืื ืืืืื ืืืจืื', '"1. ืืื DC switch ืขื ืืืืจ ืืกืืืื 2. ื ืชืง AC"'), |
| ('โ ืชืืขืื', 'ืชืื ืืช, ืืืฉืืจืื, ืกืจืืืืืื, ืชืืื ืืช'), |
| ('โ ืืกืืจื ืืืงืื', 'ืืืจืื: ืืคืืืงืฆืื, ืืฆืืื, ืืืจืื, ืชืืืืงื'), |
| ]) |
|
|
| |
| box = add_shape(slide, Inches(6.8), Inches(3.4), Inches(5.9), Inches(2.8), fill_color=WHITE, line_color=NAVY) |
| add_multiline_box(slide, Inches(7), Inches(3.5), Inches(5.5), Inches(2.6), [ |
| ('ืืืืืื ืืืจืกื ืงืืืืช โ ืืืืื ืืืจืื:', 14, NAVY, True), |
| ('', 6), |
| ('ืืคืขืื/ืืืืื ืืจื DC switch ืืืื ื', 13, DARK_TEXT, True), |
| ('(ืื DC Isolators ืืืฆืื ืืื)', 12, GRAY), |
| ('', 6), |
| ('1. ืืื DC switch ืขื ืืืืืจ', 13, RED, True), |
| ('2. ืืื DC switch ืขื ืืกืืืื', 13, RED, True), |
| ('3. ื ืชืง ืืคืกืง AC', 13, RED, True), |
| ('', 6), |
| ('โ ืคืื ืืื ืืืฉืืืื ืืืืฆืจ ืืชื (~396V)', 12, RED), |
| ('ืื ืขืื ืืฉ ืืืจ โ ืื ืืืขืช ื-MC4!', 12, RED, True), |
| ]) |
|
|
| |
| |
| |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) |
| set_slide_bg(slide, NAVY) |
|
|
| add_shape(slide, Inches(5.5), Inches(3.3), Inches(2.5), Pt(3), fill_color=GOLD, shape_type=MSO_SHAPE.RECTANGLE) |
|
|
| add_text_box(slide, Inches(1), Inches(2), Inches(11), Inches(1), |
| 'ืชืื ืืช ืืฉืืืืช โ ืืืืช ืืืืจ', font_size=36, color=WHITE, bold=True, alignment=PP_ALIGN.CENTER) |
| add_text_box(slide, Inches(1), Inches(2.8), Inches(11), Inches(0.5), |
| 'ืืขืจืืช ืกืืืืจืืช ืืืืจืืืืช | 11.16kWp | 18.8kWh | Zero Export', font_size=20, color=RGBColor(0xA8, 0xD8, 0xEA), alignment=PP_ALIGN.CENTER) |
|
|
| add_multiline_box(slide, Inches(1), Inches(3.8), Inches(11), Inches(2), [ |
| ('ืืืคืืืืืื ืกืืจืชืืช | ืืื CT | DC switch ืืืื ื | C40', 14, GOLD, True, PP_ALIGN.CENTER), |
| ('', 10), |
| ('ืืกืื ืื ืืืื ืืฆืจืื ืชืื ืื ืืืื', 14, RGBColor(0xCD, 0xDE, 0xEE), False, PP_ALIGN.CENTER), |
| ('ืืืื ื ืืืืื ืชืื ืืช ืืฉืืืืช ืจืฉืืืช.', 14, RGBColor(0xCD, 0xDE, 0xEE), False, PP_ALIGN.CENTER), |
| ('ืืฉ ืืืืื ืขื ืืฉืืืื ืืืกืื ืืคื ื ืืืฆืืข.', 14, RGBColor(0xCD, 0xDE, 0xEE), True, PP_ALIGN.CENTER), |
| ('', 10), |
| ('ืืื ืกืคืจื | ืืจืฅ 2026', 16, GOLD, False, PP_ALIGN.CENTER), |
| ]) |
|
|
| |
| output_path = os.path.expanduser('~/Documents/GitHub/Baseline/ืชืื ืืช_ืืฉืืืืช_ืืืืช_ืืืืจ.pptx') |
| prs.save(output_path) |
| print(f'Saved: {output_path}') |
| print(f'Slides: {len(prs.slides)}') |
|
|