{"id":798,"date":"2024-11-27T18:20:08","date_gmt":"2024-11-27T18:20:08","guid":{"rendered":"https:\/\/hintek.se\/?page_id=798"},"modified":"2025-08-18T19:11:22","modified_gmt":"2025-08-18T19:11:22","slug":"effektformel-3-fas","status":"publish","type":"page","link":"https:\/\/hintek.se\/index.php\/effektformel-3-fas\/","title":{"rendered":"Effektformel \u2013 3-fas"},"content":{"rendered":"\n<!--\n  SPDX-License-Identifier: MIT\n  Copyright (c) 2025 HINTEK Power Solutions AB\n\n  Tillst\u00e5nd ges h\u00e4rmed, kostnadsfritt, till varje person som erh\u00e5ller en kopia\n  av denna programvara och tillh\u00f6rande dokumentationsfiler (\"Programvaran\"),\n  att utan begr\u00e4nsning hantera Programvaran, inklusive utan begr\u00e4nsning r\u00e4tten\n  att anv\u00e4nda, kopiera, modifiera, sl\u00e5 samman, publicera, distribuera, s\u00e4lja och\/eller\n  underlicensiera kopior av Programvaran, samt att till\u00e5ta personer som Programvaran\n  tillhandah\u00e5lls att g\u00f6ra detta, under f\u00f6ljande villkor:\n\n  Ovanst\u00e5ende copyright-notis och denna till\u00e5telsenotis ska inkluderas i alla kopior\n  eller v\u00e4sentliga delar av Programvaran.\n\n  PROGRAMVARAN TILLHANDAH\u00c5LLS \"I BEFINTLIGT SKICK\", UTAN N\u00c5GRA SOM HELST GARANTIER,\n  VARE SIG UTTRYCKLIGA ELLER UNDERF\u00d6RST\u00c5DDA, INKLUSIVE MEN INTE BEGR\u00c4NSAT TILL GARANTIER\n  OM S\u00c4LJBARHET, L\u00c4MPLIGHET F\u00d6R VISST \u00c4NDAM\u00c5L OCH ICKE-INTR\u00c5NG. UNDER INGA OMST\u00c4NDIGHETER\n  SKA UPPHOVSM\u00c4N ELLER COPYRIGHT-INNEHAVARE VARA ANSVARIGA F\u00d6R N\u00c5GRA ANSPR\u00c5K, SKADOR ELLER\n  ANNAT ANSVAR, VARE SIG I AVTALSTVIST, SKADEST\u00c5ND ELLER ANNAT, SOM UPPST\u00c5R TILL F\u00d6LJD AV,\n  UR ELLER I SAMBAND MED PROGRAMVARAN ELLER ANV\u00c4NDNING ELLER ANNAN HANTERING AV PROGRAMVARAN.\n\n  Tredjepart:\n  - MathJax \u00a9 dess upphovsm\u00e4n, licens: Apache-2.0 (https:\/\/www.apache.org\/licenses\/LICENSE-2.0)\n    Vid CDN-l\u00e4nkning r\u00e4cker denna notis; vid bundling\/distribution av MathJax, inkludera dess licens\/NOTICE.\n-->\n<!DOCTYPE html>\n<html lang=\"sv\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\/>\n  <title>Trefas effektkalkylator \u2013 P, Q, S &amp; cos \u03c6 | HINTEK Power Solutions AB<\/title>\n  <meta name=\"description\" content=\"Gratis trefas-kalkylator fr\u00e5n HINTEK Power Solutions AB. R\u00e4kna P, Q, S och cos \u03c6 och se effekttriangeln visuellt.\">\n  <meta name=\"author\" content=\"HINTEK Power Solutions AB\">\n  <meta name=\"robots\" content=\"index,follow\">\n  <link rel=\"canonical\" href=\"https:\/\/hintek.se\/index.php\/effektformel-3-fas\/\">\n  <link rel=\"preconnect\" href=\"https:\/\/cdn.jsdelivr.net\" crossorigin>\n\n  <meta property=\"og:type\" content=\"website\">\n  <meta property=\"og:locale\" content=\"sv_SE\">\n  <meta property=\"og:title\" content=\"Trefas effektkalkylator \u2013 P, Q, S &amp; cos \u03c6\">\n  <meta property=\"og:description\" content=\"Gratis trefas-kalkylator fr\u00e5n HINTEK Power Solutions AB. R\u00e4kna P, Q, S och cos \u03c6 och se effekttriangeln.\">\n  <meta property=\"og:site_name\" content=\"HINTEK Power Solutions AB\">\n  <meta property=\"og:url\" content=\"https:\/\/hintek.se\/index.php\/effektformel-3-fas\/\">\n  <meta name=\"twitter:card\" content=\"summary\">\n  <!-- MathJax configuration for stable height -->\n  <script>\n    window.MathJax = {\n      tex: { inlineMath: [['$', '$'], ['\\\\(', '\\\\)']] },\n      chtml: { matchFontHeight: false }\n    };\n  <\/script>\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/mathjax@3\/es5\/tex-mml-chtml.js\" defer><\/script>\n  <style>\n    #power-calculation-widget { font-family: Arial, sans-serif; margin: 20px; background:#ffffff; color:#333; }\n    #power-calculation-widget h1, #power-calculation-widget h3 { text-align:center; margin-top:0; }\n    #power-calculation-widget .container {\n      max-width: 600px; margin: 0 auto; background:#ffffff; border-radius:8px;\n      box-shadow:0 0 10px rgba(0,0,0,.1); padding:20px;\n    }\n    #power-calculation-widget label { display:block; margin:10px 0 5px; font-weight:bold; }\n    #power-calculation-widget input, #power-calculation-widget select {\n      width: calc(100% - 20px); padding:8px 10px; font-size:16px; margin-bottom:15px;\n      border:1px solid #ccc; border-radius:4px; height:44px; box-sizing:border-box;\n    }\n    #power-calculation-widget .results {\n      margin-top:20px; background:#ffffff; border:1px solid #c3e6cb; border-radius:4px;\n      padding:10px; font-size:16px; line-height:1.6;\n    }\n        #formulaBox { position: relative; height: 110px; overflow: hidden; }\n    #formulaBox .formula { position:absolute; left:0; right:0; top:50%; transform:translateY(-50%); text-align:center; }\n    #formulaBox .mjx-chtml { line-height: 1; }\n    #result { min-height: 72px; }\n        #triangleSection { margin-top:20px; border:1px solid #c3e6cb; border-radius:4px; padding:10px; }\n    #triangleSvg { width:100%; height:420px; }\n    #triangleSvg svg { width:100%; height:100%; }    #triangleInfo { margin-top:8px; font-size:14px; line-height:1.4; }\n    #phiBelow { font-size:14px; }\n        #triangleSvg text { font-size:12px !important; }\n  <\/style>\n<script type=\"application\/ld+json\">\n  {\n    \"@context\": \"https:\/\/schema.org\",\n    \"@type\": \"WebApplication\",\n    \"name\": \"Trefas effektkalkylator\",\n    \"applicationCategory\": \"Calculator\",\n    \"operatingSystem\": \"Web\",\n    \"inLanguage\": \"sv\",\n    \"url\": \"https:\/\/hintek.se\/index.php\/effektformel-3-fas\/\",\n    \"description\": \"Interaktiv trefas-kalkylator f\u00f6r P, Q, S och cos \u03c6 med effekttriangel.\",\n    \"provider\": {\"@type\":\"Organization\",\"name\":\"HINTEK Power Solutions AB\"},\n    \"offers\": {\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"SEK\"}\n  }\n<\/script>\n<\/head>\n<body>\n<div id=\"power-calculation-widget\">\n  <div class=\"container\">\n    <h3>Effektformel \u2013 3-fas<\/h3>\n\n        <div id=\"formulaBox\" class=\"results\">\n      <div id=\"formulaP\" class=\"formula\">$$P = U \\cdot I \\cdot \\cos(\\varphi) \\cdot \\sqrt{3}$$<\/div>\n      <div id=\"formulaI\" class=\"formula\" style=\"display:none;\">$$I = \\frac{P}{U \\cdot \\cos(\\varphi) \\cdot \\sqrt{3}}$$<\/div>\n    <\/div>\n\n    <form id=\"powerForm\" onsubmit=\"return false;\">\n      <label for=\"solveFor\">Ber\u00e4kna:<\/label>\n      <select id=\"solveFor\">\n        <option value=\"P\">P (effekt)<\/option>\n        <option value=\"I\">I (str\u00f6m)<\/option>\n      <\/select>\n\n      <label for=\"voltage\">Sp\u00e4nning (U) i Volt:<\/label>\n      <input type=\"number\" id=\"voltage\" placeholder=\"Ex: 400\" step=\"any\" min=\"0\"\/>\n\n      <label for=\"current\">Str\u00f6m (I) i Ampere:<\/label>\n      <input type=\"number\" id=\"current\" placeholder=\"Ex: 10\" step=\"any\" min=\"0\"\/>\n\n      <label for=\"cosPhi\">Effektfaktor (cos \u03c6):<\/label>\n      <input type=\"number\" id=\"cosPhi\" placeholder=\"Ex: 0,85\" step=\"0.01\" min=\"0\" max=\"1\" \/>\n\n      <label for=\"power\">Effekt (P) i Watt:<\/label>\n      <input type=\"number\" id=\"power\" placeholder=\"Ex: 5000\" step=\"any\" min=\"0\" \/>\n    <\/form>\n\n    <div id=\"result\" class=\"results\" style=\"display:none;\"><\/div>\n\n    <div id=\"triangleSection\" style=\"display:none;\">\n      <strong>Effekttriangel<\/strong>\n      <div id=\"triangleSvg\"><\/div>\n      <div id=\"triangleInfo\"><\/div>\n    <\/div>\n\n    <!-- F\u00f6rklarande text -->\n    <div id=\"explanation\" class=\"results\" style=\"margin-top: 20px;\">\n      <strong>F\u00f6rklaring av effekt och effektfaktor<\/strong>\n      <p>Aktiv effekt (P) \u00e4r den verkliga effekten som omvandlas till nyttigt arbete eller v\u00e4rme i lasten. Den m\u00e4ts i watt (W) och anges ofta i kilowatt (kW).<\/p>\n      <p>Skenbar effekt (S) \u00e4r den totala effekten i ett trefassystem och best\u00e5r av den aktiva plus den reaktiva effekten. Den m\u00e4ts i voltampere (VA) och anges ofta i kilovoltampere (kVA). F\u00f6r trefas g\u00e4ller <em>S = \u221a3\u00b7U\u00b7I<\/em>.<\/p>\n      <p>Reaktiv effekt (Q) \u00e4r den del av effekten vars energi <em>pendlar<\/em> mellan k\u00e4llan (generatorn\/n\u00e4tet) och lasten \u2013 fram och tillbaka varje n\u00e4tperiod \u2013 p\u00e5 grund av energilagring i magnetiska och elektriska f\u00e4lt (induktiva\/kapacitiva komponenter). Den bidrar inte till nyttigt arbete i lasten men beh\u00f6vs t.ex. f\u00f6r magnetisering. Den m\u00e4ts i var och anges ofta i kilovar (kvar).<\/p>\n      <p>Effektfaktor, eller cos&nbsp;\u03c6, \u00e4r f\u00f6rh\u00e5llandet mellan aktiv och skenbar effekt: <em>cos&nbsp;\u03c6 = P\/S<\/em>.<\/p>\n    <\/div>\n\n    <div id=\"footnote\" class=\"results\" style=\"margin-top:20px;font-size:12px;text-align:center;\"><\/div>\n  <\/div>\n<\/div>\n\n<script>\n(() => {\n  const $ = id => document.getElementById(id);\n  const SQRT3 = Math.sqrt(3);\n  const nf2 = new Intl.NumberFormat('sv-SE', { maximumFractionDigits: 2 });\n\n  \/\/ DOM\n  const solveForEl = $(\"solveFor\");\n  const voltageEl = $(\"voltage\");\n  const currentEl = $(\"current\");\n  const cosPhiEl = $(\"cosPhi\");\n  const powerEl = $(\"power\");\n  const resultEl = $(\"result\");\n  const formulaPEl = $(\"formulaP\");\n  const formulaIEl = $(\"formulaI\");\n  const triangleSectionEl = $(\"triangleSection\");\n  const triangleSvgEl = $(\"triangleSvg\");\n  const triangleInfoEl = $(\"triangleInfo\");\n  const footnoteEl = $(\"footnote\");\n\n  \/\/ MathJax typeset\n  function ensureTypeset() {\n    if (!window.MathJax || !MathJax.typesetPromise) return;\n    const pending = [];\n    if (!formulaPEl.dataset.typeset) pending.push(formulaPEl);\n    if (!formulaIEl.dataset.typeset) pending.push(formulaIEl);\n    if (pending.length) {\n      MathJax.typesetPromise(pending).then(() => pending.forEach(el => el.dataset.typeset = \"1\"));\n    }\n  }\n\n  function updateFormulaVisibility() {\n    if (solveForEl.value === 'P') {\n      formulaPEl.style.display = 'block';\n      formulaIEl.style.display = 'none';\n      powerEl.setAttribute('readonly', 'readonly');\n      currentEl.removeAttribute('readonly');\n    } else {\n      formulaPEl.style.display = 'none';\n      formulaIEl.style.display = 'block';\n      powerEl.removeAttribute('readonly');\n      currentEl.setAttribute('readonly', 'readonly');\n    }\n  }\n\n  \/\/ Parse helpers\n  function parseVal(el) {\n    const raw = String(el.value || '').trim().replace(\/\\s+\/g, '').replace(\/,\/g, '.');\n    if (!raw) return NaN;\n    const v = parseFloat(raw);\n    return Number.isFinite(v) ? v : NaN;\n  }\n\n  function formatVal(num) {\n    if (!Number.isFinite(num)) return '';\n    return num.toFixed(2).replace('.', ',');\n  }\n\n  let internalUpdate = false;\n  function setFieldValue(el, num) {\n    let val = '';\n    if (Number.isFinite(num)) {\n      if (el.type === 'number') {\n        \/\/ number-input kr\u00e4ver punkt som decimal\n        val = num.toFixed(2);\n      } else {\n        \/\/ text-input kan visa svensk komma\n        val = num.toFixed(2).replace('.', ',');\n      }\n    }\n    if (el && el.value !== val) {\n      internalUpdate = true;\n      el.value = val;\n      internalUpdate = false;\n    }\n  }\n\n  function showResult(html) {\n    resultEl.innerHTML = html;\n    resultEl.style.display = 'block';\n  }\n  function hideResult() {\n    resultEl.style.display = 'none';\n    resultEl.innerHTML = '';\n  }\n\n    function updateTriangle(U, I, cos, PIn) {\n    let Pcalc = NaN;\n    let S = NaN;\n\n    if (solveForEl.value === 'P') {\n      if (Number.isFinite(U) && Number.isFinite(I)) Pcalc = U * I * cos * SQRT3;\n    } else {\n      Pcalc = Number.isFinite(PIn) ? PIn : NaN;\n    }\n\n    if (Number.isFinite(U) && Number.isFinite(I)) {\n      S = SQRT3 * U * I;\n    } else if (Number.isFinite(Pcalc) && Number.isFinite(cos) && cos > 0) {\n      S = Pcalc \/ cos;\n    }\n\n    if (!Number.isFinite(Pcalc) || !Number.isFinite(S) || S <= 0) {\n      triangleSectionEl.style.display = 'none';\n      triangleSvgEl.innerHTML = '';\n      triangleInfoEl.innerHTML = '';\n      return;\n    }\n\n    const Q = Math.sqrt(Math.max(0, S*S - Pcalc*Pcalc));\n\n    const Pk = Pcalc\/1000, Qk = Q\/1000, Sk = S\/1000;\n    const rawMax = Math.max(Pk, Qk, Sk);\n    const maxVal = rawMax * 1.03;\n\n    const width  = triangleSvgEl.clientWidth  || triangleSvgEl.offsetWidth  || 400;\n    const height = triangleSvgEl.clientHeight || triangleSvgEl.offsetHeight || 300;\n\n    const margin = 12;\n    \/\/ Nu n\u00e4r Q-etiketten ligger till h\u00f6ger beh\u00f6vs ingen extra v\u00e4nsterbuffert\n    const leftMargin = margin, rightMargin = margin, topMargin = margin, bottomMargin = margin + 28; \/\/ extra utrymme f\u00f6r P-etiketten under axeln\n\n    const availW = width - leftMargin - rightMargin;\n    const availH = height - topMargin - bottomMargin;\n    const scale = Math.min(availW, availH) \/ (maxVal === 0 ? 1 : maxVal);\n\n    const originX = leftMargin + (availW - (maxVal * scale)) \/ 2;\n    const originY = height - bottomMargin;\n\n    const pxEnd = originX + Pk*scale;\n    const pyEnd = originY;\n    const qxEnd = pxEnd;\n    const qyEnd = originY - Qk*scale;\n    \/\/ Q-benet ska alltid n\u00e5 ner till P (x-axeln)\n    const qBottomY = originY;\n\n    const sEndX = originX + Pk*scale;\n    const sEndY = originY - Qk*scale;\n\n    const r = Sk * scale;\n\n    \/\/ Axlar ska m\u00f6ta cirkeln (inte hela ritytans kant)\n    const axisXEnd = originX + r;\n    const axisYEnd = originY - r;\n\n    let svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 ${width} ${height}\" preserveAspectRatio=\"xMidYMid meet\">`;\n\n        svg += `<path d=\"M ${originX} ${originY - r} A ${r} ${r} 0 0 1 ${originX + r} ${originY}\" fill=\"none\" stroke=\"#ccc\" stroke-width=\"1\"\/>`;\n\n        const gridLines = 4;\n    for (let i=1;i<=gridLines;i++){\n      const gx = originX + (maxVal*scale\/gridLines)*i;\n      const gy = originY - (maxVal*scale\/gridLines)*i;\n      svg += `<line x1=\"${gx}\" y1=\"${originY}\" x2=\"${gx}\" y2=\"${originY - maxVal*scale}\" stroke=\"#eee\" stroke-width=\"1\"\/>`;\n      svg += `<line x1=\"${originX}\" y1=\"${gy}\" x2=\"${originX + maxVal*scale}\" y2=\"${gy}\" stroke=\"#eee\" stroke-width=\"1\"\/>`;\n    }\n\n        svg += `<defs><marker id=\"arrow\" markerWidth=\"7\" markerHeight=\"7\" refX=\"6\" refY=\"3.5\" orient=\"auto\"><path d=\"M0,0 L7,3.5 L0,7 z\" fill=\"#666\"><\/path><\/marker><\/defs>`;\n\n        svg += `<line x1=\"${originX}\" y1=\"${originY}\" x2=\"${pxEnd}\" y2=\"${pyEnd}\" stroke=\"#007bff\" stroke-width=\"2\"\/>`;\n    svg += `<line x1=\"${pxEnd}\" y1=\"${qBottomY}\" x2=\"${pxEnd}\" y2=\"${qyEnd}\" stroke=\"#ffa500\" stroke-width=\"2\"\/>`;\n    svg += `<line x1=\"${originX}\" y1=\"${originY}\" x2=\"${sEndX}\" y2=\"${sEndY}\" stroke=\"#28a745\" stroke-width=\"2\"\/>`;\n\n        svg += `<line x1=\"${originX}\" y1=\"${originY}\" x2=\"${axisXEnd}\" y2=\"${originY}\" stroke=\"#666\" stroke-width=\"1\" marker-end=\"url(#arrow)\"\/>`;\n    svg += `<line x1=\"${originX}\" y1=\"${originY}\" x2=\"${originX}\" y2=\"${axisYEnd}\" stroke=\"#666\" stroke-width=\"1\" marker-end=\"url(#arrow)\"\/>`;\n\n    \n        const phiRadLabel = Math.acos(Math.min(Math.max(Pcalc \/ S, -1), 1));\n    const phiDegLabel = phiRadLabel * 180 \/ Math.PI;\n    const phiLabelX = Math.max(leftMargin + 4, originX - 8);\n    const phiLabelY = originY - 1; \/\/ tidigare -6, flyttad ned 5 px\n    svg += `<text x=\"${phiLabelX}\" y=\"${phiLabelY}\" font-size=\"12\" text-anchor=\"end\" dominant-baseline=\"baseline\" fill=\"#444\">\u03c6 \u2248 ${nf2.format(phiDegLabel)}\u00b0<\/text>`;\n\n            \/\/ s\u00e5 den aldrig beh\u00f6ver flyttas \u00e5t v\u00e4nster n\u00e4r cos\u03c6 \u2192 1\n    const maxX = originX + maxVal * scale;\n    const qLabelX = Math.min(pxEnd + 25, maxX - 6);\n        \/\/ men s\u00e4kerst\u00e4ll att den aldrig ligger p\u00e5 x-axeln\n    let qLabelY = (originY + qyEnd) \/ 2;\n    qLabelY = Math.min(qLabelY, originY - 12);\n\n    svg += `<text x=\"${originX + (pxEnd - originX)\/2}\" y=\"${originY + 18}\" font-size=\"12\" text-anchor=\"middle\" dominant-baseline=\"hanging\" fill=\"#007bff\">P \u2248 ${nf2.format(Pk)} kW<\/text>`;\n    svg += `<text x=\"${qLabelX}\" y=\"${qLabelY}\" font-size=\"12\" text-anchor=\"start\" dominant-baseline=\"middle\" fill=\"#ffa500\">Q \u2248 ${nf2.format(Qk)} kvar<\/text>`;\n\n        const dxS = sEndX - originX;\n    const dyS = sEndY - originY;\n\n        const baseSX = originX + dxS * 0.5;\n    const baseSY = originY + dyS * 0.5;\n\n        const lenS = Math.hypot(dxS, dyS) || 1;\n    let nX = dyS \/ lenS;   \/\/ < 0 n\u00e4r S lutar upp\u00e5t \u2192 v\u00e4nster\n    let nY = -dxS \/ lenS;  \/\/ \u2264 0 \u2192 upp\u00e5t eller rakt \u00e5t v\u00e4nster\n    if (nY > 0) { nX = -nX; nY = -nY; }\n\n        let sOffset = 24 + r * 0.07 + (1 - Math.min(Math.max(cos, 0), 1)) * 24; \/\/ 24..~64 px\n    sOffset = Math.max(18, Math.min(64, sOffset));\n\n    let sLabelX = baseSX + nX * sOffset;\n    let sLabelY = baseSY + nY * sOffset;\n\n        const minXc = leftMargin + 2, maxXc = originX + maxVal*scale - 6;\n    const minYc = originY - maxVal*scale + 6, maxYc = originY - 6;\n    sLabelX = Math.max(minXc, Math.min(maxXc, sLabelX));\n    sLabelY = Math.max(minYc, Math.min(maxYc, sLabelY));\n\n    svg += `<text x=\"${sLabelX}\" y=\"${sLabelY}\" font-size=\"12\" text-anchor=\"middle\" dominant-baseline=\"middle\" fill=\"#28a745\">S \u2248 ${nf2.format(Sk)} kVA<\/text>`;\n\n    svg += `<\/svg>`;\n    triangleSvgEl.innerHTML = svg;\n\n        const phiRad = Math.acos(Math.min(Math.max(Pcalc \/ S, -1), 1));\n    const phiDeg = phiRad * 180\/Math.PI;\n    const infoHTML =\n      `\u03c6 = cos\u207b\u00b9(${nf2.format(Pcalc)} \/ ${nf2.format(S)}) \u2248 ${nf2.format(phiDeg)}\u00b0` +\n      `<br>P = ${nf2.format(Pcalc)} W (${nf2.format(Pcalc\/1000)} kW)` +\n      `<br>Q = ${nf2.format(Q)} var (${nf2.format(Q\/1000)} kvar)` +\n      `<br>S = ${nf2.format(S)} VA (${nf2.format(S\/1000)} kVA)`;\n\n        triangleInfoEl.innerHTML = '';\n\n        let phiBelow = document.getElementById('phiBelow');\n    if (!phiBelow) {\n      phiBelow = document.createElement('div');\n      phiBelow.id = 'phiBelow';\n      phiBelow.style.marginTop = '6px';\n      resultEl.appendChild(phiBelow);\n    }\n    phiBelow.innerHTML = infoHTML;\n\n    triangleSectionEl.style.display = 'block';\n  }\n\n  function calculate() {\n    if (internalUpdate) return;\n    const mode = solveForEl.value;\n    const U = parseVal(voltageEl);\n    const I = parseVal(currentEl);\n        const cosRaw = String(cosPhiEl.value || '').trim().replace(\/\\s+\/g, '').replace(\/,\/g, '.');\n    const cosParsed = parseFloat(cosRaw);\n    const cosIsTransitional = (cosRaw === '.' || cosRaw === '');\n    const cosVal = Number.isFinite(cosParsed) ? cosParsed : (cosIsTransitional ? 0 : NaN);\n    const Pval = parseVal(powerEl);\n\n    if ((!Number.isFinite(cosParsed) && !cosIsTransitional) || cosVal < 0 || cosVal > 1) {\n      hideResult();\n      triangleSectionEl.style.display = 'none';\n      const phiBelow = document.getElementById('phiBelow');\n      if (phiBelow) phiBelow.innerHTML = '';\n      return;\n    }\n\n    let value;\n    if (mode === 'P') {\n      if (!Number.isFinite(U) || !Number.isFinite(I)) {\n        hideResult();\n        triangleSectionEl.style.display = 'none';\n        return;\n      }\n      value = U * I * cosVal * SQRT3;\n      setFieldValue(powerEl, value);\n      showResult(`Resultat:<br><strong>${nf2.format(value)} W<\/strong> (${nf2.format(value\/1000)} kW)<br><small>U=${nf2.format(U)} V, I=${nf2.format(I)} A<\/small>`);\n      updateTriangle(U, I, cosVal, NaN);\n    } else {\n      if (!Number.isFinite(Pval) || !Number.isFinite(U) || U <= 0 ) {\n        hideResult();\n        triangleSectionEl.style.display = 'none';\n        return;\n      }\n      if (!(cosVal > 0)) {\n                showResult(`Resultat:<br><small>P=${nf2.format(Pval)} W, U=${nf2.format(U)} V<\/small>`);\n        triangleSectionEl.style.display = 'none';\n        const pb = document.getElementById('phiBelow'); if (pb) pb.innerHTML = '';\n        return;\n      }\n      value = Pval \/ (U * cosVal * SQRT3);\n      setFieldValue(currentEl, value);\n      showResult(`Resultat:<br><strong>${nf2.format(value)} A<\/strong><br><small>P=${nf2.format(Pval)} W, U=${nf2.format(U)} V<\/small>`);\n      updateTriangle(U, value, cosVal, Pval);\n    }\n  }\n\n    [voltageEl, currentEl, cosPhiEl, powerEl].forEach(el => {\n    el.addEventListener('input', () => {\n      if (internalUpdate) return;\n      if ((el === cosPhiEl || el === powerEl) && el.value.includes(',')) {\n        internalUpdate = true; el.value = el.value.replace(\/,\/g,'.'); internalUpdate = false;\n      }\n      calculate();\n    });\n    el.addEventListener('blur', () => {\n      if ((el.value||'').includes(',')) {\n        internalUpdate = true; el.value = el.value.replace(\/,\/g,'.'); internalUpdate = false;\n      }\n    });\n  });\n\n  solveForEl.addEventListener('change', () => { updateFormulaVisibility(); ensureTypeset(); calculate(); });\n\n    updateFormulaVisibility();\n  ensureTypeset();\n  calculate();\n    if (window.requestAnimationFrame) requestAnimationFrame(calculate);\n    if (window.ResizeObserver) { new ResizeObserver(() => calculate()).observe(triangleSvgEl); }\n  window.addEventListener('resize', calculate);\n\n    (function manageVersion() {\n    const today = new Date().toISOString().split('T')[0];\n    const key = 'ef3f_version';\n    const base = '1.2.0';\n    try {\n      const stored = localStorage.getItem(key);\n      let vStr = base;\n      let storedDate = '';\n      if (stored) {\n        const partsStored = stored.split('::');\n        if (partsStored[0]) vStr = partsStored[0];\n        if (partsStored[1]) storedDate = partsStored[1];\n      }\n      \/\/ Bump patch om datumet \u00e4ndrats eller inget lagrat finns\n      if (!stored || storedDate !== today) {\n        const parts = vStr.split('.').map(x => parseInt(x, 10));\n        parts[2] = (parts[2] || 0) + 1;\n        vStr = `${parts.join('.')}`;\n        localStorage.setItem(key, `${vStr}::${today}`);\n      }\n      footnoteEl.textContent = `Genererat med ChatGPT (GPT-5 Thinking) \u2022 v${vStr} \u2014 ${today} \u2022 formler verifierade`;\n    } catch (e) {\n      footnoteEl.textContent = `Genererat med ChatGPT (GPT-5 Thinking) \u2022 v${base}`;\n    }\n  })();\n})();\n<\/script>\n<\/body>\n<\/html>\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Trefas effektkalkylator \u2013 P, Q, S &amp; cos \u03c6 | HINTEK Power Solutions AB Effektformel \u2013 3-fas $$P = U [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-798","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/pages\/798","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/comments?post=798"}],"version-history":[{"count":19,"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/pages\/798\/revisions"}],"predecessor-version":[{"id":1190,"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/pages\/798\/revisions\/1190"}],"wp:attachment":[{"href":"https:\/\/hintek.se\/index.php\/wp-json\/wp\/v2\/media?parent=798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}