Download scripts/create_pptx.py from SolarWine/api: direct link, hf CLI and curl.
- Browser
- Download file 41.3 kB
-
https://huggingface.co/spaces/SolarWine/api/resolve/main/scripts/create_pptx.py
- Command line
-
hf download hf://spaces/SolarWine/api/scripts/create_pptx.py
-
curl -L -o create_pptx.py https://huggingface.co/spaces/SolarWine/api/resolve/main/scripts/create_pptx.py
41.3 kB
| """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) | |
| # ββ Color palette ββ | |
| 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) | |
| # ββ Helpers ββ | |
| 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 1 β Title | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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]) | |
| # Bottom bar | |
| 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 2 β Notes (replacing Critical Warnings) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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) | |
| # Status badge on the right | |
| 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) | |
| # Key info box | |
| 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 3 β Single Line Diagram | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) | |
| set_slide_bg(slide, LIGHT_BG) | |
| section_header(slide, '1. ΧͺΧ¨Χ©ΧΧ ΧΧ-Χ§ΧΧΧ (Single Line Diagram)') | |
| # Series topology banner | |
| 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) | |
| # ββ Block positions (all in inches, stored for line drawing) ββ | |
| # PV Strings | |
| 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 | |
| # Inverter | |
| inv_x, inv_y, inv_w, inv_h = 4.5, 2.85, 4.2, 0.9 | |
| # Battery | |
| bat_x, bat_y, bat_w, bat_h = 0.5, 2.95, 2.3, 0.8 | |
| # SPD | |
| spd_x, spd_y, spd_w, spd_h = 5.1, 4.1, 1.8, 0.5 | |
| # MCB | |
| mcb_x, mcb_y, mcb_w, mcb_h = 7.2, 4.1, 1.5, 0.5 | |
| # Changeover | |
| chg_x, chg_y, chg_w, chg_h = 5.4, 4.85, 2.5, 0.55 | |
| # Grid | |
| grid_x, grid_y, grid_w, grid_h = 2.5, 5.75, 2.0, 0.55 | |
| # Load | |
| load_x, load_y, load_w, load_h = 8.5, 5.75, 2.0, 0.55 | |
| # Backup | |
| bkp_x, bkp_y, bkp_w, bkp_h = 10.5, 2.95, 2.2, 0.8 | |
| # ββ Draw blocks ββ | |
| 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) | |
| # ββ Draw connecting lines ββ | |
| # String 1 bottom center β down to merge line | |
| s1_cx = s1_x + s1_w / 2 # 3.25 | |
| s1_bot = s1_y + s1_h # 2.35 | |
| add_line_v(slide, Inches(s1_cx), Inches(s1_bot), Inches(0.25), DC_PV_COLOR) | |
| # String 2 bottom center β down to merge line | |
| s2_cx = s2_x + s2_w / 2 # 9.75 | |
| s2_bot = s2_y + s2_h # 2.35 | |
| add_line_v(slide, Inches(s2_cx), Inches(s2_bot), Inches(0.25), DC_PV_COLOR) | |
| # Horizontal merge line between String 1 and String 2 at y=2.6 | |
| merge_y = 2.6 | |
| add_line_h(slide, Inches(s1_cx), Inches(merge_y), Inches(s2_cx - s1_cx), DC_PV_COLOR) | |
| # Center of merge β down to inverter top | |
| inv_cx = inv_x + inv_w / 2 # 6.6 | |
| add_line_v(slide, Inches(inv_cx), Inches(merge_y), Inches(inv_y - merge_y), DC_PV_COLOR) | |
| # Battery right edge β horizontal to inverter left edge (DC HV) | |
| bat_right = bat_x + bat_w # 2.8 | |
| bat_cy = bat_y + bat_h / 2 # 3.35 | |
| add_line_h(slide, Inches(bat_right), Inches(bat_cy), Inches(inv_x - bat_right), DC_BATT_COLOR) | |
| # BMS label | |
| 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) | |
| # ββ AC path: Inverter β SPD β MCB β Changeover ββ | |
| inv_bot = inv_y + inv_h # 3.75 | |
| spd_cx = spd_x + spd_w / 2 # 6.0 | |
| spd_cy = spd_y + spd_h / 2 # 4.35 | |
| spd_right = spd_x + spd_w # 6.9 | |
| mcb_cx = mcb_x + mcb_w / 2 # 7.95 | |
| mcb_bot = mcb_y + mcb_h # 4.6 | |
| chg_cx = chg_x + chg_w / 2 # 6.65 | |
| chg_top = chg_y # 4.85 | |
| # 1. Inv center (6.60) down short | |
| elbow_y = inv_bot + 0.08 # 3.83 | |
| add_line_v(slide, Inches(inv_cx), Inches(inv_bot), Inches(elbow_y - inv_bot), AC_GRID_COLOR) | |
| # 2. Horizontal jog from inv_cx (6.60) to spd_cx (6.00) | |
| add_line_h(slide, Inches(spd_cx), Inches(elbow_y), Inches(inv_cx - spd_cx), AC_GRID_COLOR) | |
| # 3. Down from spd_cx to SPD top (6.00, 4.10) | |
| add_line_v(slide, Inches(spd_cx), Inches(elbow_y), Inches(spd_y - elbow_y), AC_GRID_COLOR) | |
| # 4. SPD right β MCB left | |
| add_line_h(slide, Inches(spd_right), Inches(spd_cy), Inches(mcb_x - spd_right), AC_GRID_COLOR) | |
| # 5. MCB bottom center β down | |
| elbow2_y = mcb_bot + 0.05 # 4.65 | |
| add_line_v(slide, Inches(mcb_cx), Inches(mcb_bot), Inches(elbow2_y - mcb_bot), AC_GRID_COLOR) | |
| # 6. Horizontal from mcb_cx to chg_cx | |
| add_line_h(slide, Inches(chg_cx), Inches(elbow2_y), Inches(mcb_cx - chg_cx), AC_GRID_COLOR) | |
| # 7. Down from chg_cx to changeover top | |
| add_line_v(slide, Inches(chg_cx), Inches(elbow2_y), Inches(chg_top - elbow2_y), AC_GRID_COLOR) | |
| # Changeover bottom β down then split left/right | |
| chg_bot = chg_y + chg_h # 5.4 | |
| branch_y = 5.55 | |
| add_line_v(slide, Inches(chg_cx), Inches(chg_bot), Inches(branch_y - chg_bot), AC_DIST_COLOR) | |
| # Horizontal branch line | |
| grid_cx = grid_x + grid_w / 2 # 3.5 | |
| load_cx = load_x + load_w / 2 # 9.5 | |
| add_line_h(slide, Inches(grid_cx), Inches(branch_y), Inches(load_cx - grid_cx), AC_DIST_COLOR) | |
| # Grid branch: down from branch line to grid block | |
| add_line_v(slide, Inches(grid_cx), Inches(branch_y), Inches(grid_y - branch_y), AC_DIST_COLOR) | |
| # Load branch: down from branch line to load block | |
| add_line_v(slide, Inches(load_cx), Inches(branch_y), Inches(load_y - branch_y), AC_DIST_COLOR) | |
| # Backup: Inverter right β horizontal to backup block left | |
| inv_right = inv_x + inv_w # 8.7 | |
| inv_cy = inv_y + inv_h / 2 # 3.3 | |
| bkp_left = bkp_x # 10.5 | |
| bkp_cy = bkp_y + bkp_h / 2 # 3.35 | |
| # Horizontal line | |
| add_line_h(slide, Inches(inv_right), Inches(inv_cy), Inches(bkp_left - inv_right), AC_BACKUP_COLOR) | |
| # Backup label | |
| 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 with colored line samples ββ | |
| 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 4 β Component List (10 items) | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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 about what's NOT in the list | |
| 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 5 β Cable Specifications | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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]) | |
| # Ferrite note | |
| 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 6 β Installation Guidelines | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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 7 β QA Open Items | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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 8 β QA Verified | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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 9 β Execution Phase A+B | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| slide = prs.slides.add_slide(prs.slide_layouts[6]) | |
| set_slide_bg(slide, LIGHT_BG) | |
| section_header(slide, '6. ΧΧ ΧΧΧΧͺ ΧΧΧ¦ΧΧ’ β Χ©ΧΧ Χ\'+Χ\'') | |
| # Warning | |
| 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 10 β Execution Phase C+D | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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 11 β Execution Phase E+F | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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"'), | |
| ('β ΧͺΧΧ’ΧΧ', 'ΧͺΧΧ ΧΧͺ, ΧΧΧ©ΧΧ¨ΧΧ, Χ‘Χ¨ΧΧΧΧΧΧ, ΧͺΧΧΧ ΧΧͺ'), | |
| ('β ΧΧ‘ΧΧ¨Χ ΧΧΧ§ΧΧ', 'ΧΧΧ¨ΧΧ: ΧΧ€ΧΧΧ§Χ¦ΧΧ, ΧΧ¦ΧΧΧ, ΧΧΧ¨ΧΧ, ΧͺΧΧΧΧ§Χ'), | |
| ]) | |
| # Key differences box | |
| 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 12 β Closing | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| 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), | |
| ]) | |
| # ββ Save ββ | |
| output_path = os.path.expanduser('~/Documents/GitHub/Baseline/ΧͺΧΧ ΧΧͺ_ΧΧ©ΧΧΧΧͺ_ΧΧΧΧͺ_ΧΧΧΧ¨.pptx') | |
| prs.save(output_path) | |
| print(f'Saved: {output_path}') | |
| print(f'Slides: {len(prs.slides)}') | |