{"id":1,"date":"2026-11-03T19:32:42","date_gmt":"2026-11-03T19:32:42","guid":{"rendered":"https:\/\/virtahinta.fi\/?p=1"},"modified":"2026-11-04T09:27:45","modified_gmt":"2026-11-04T09:27:45","slug":"hello-world","status":"publish","type":"post","link":"https:\/\/virtahinta.fi\/?p=1","title":{"rendered":"Hello world!"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Welcome to WordPress. This is your first post. Edit or delete it, then start writing!<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"fi\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>VirtaHinta.fi &#8211; EV-latauslaskuri<\/title>\n\n<style>\nbody{\n    font-family:Arial,sans-serif;\n    max-width:1000px;\n    margin:30px auto;\n    padding:20px;\n    background:#f5f7fa;\n}\n\n.card{\n    background:white;\n    padding:20px;\n    border-radius:12px;\n    box-shadow:0 2px 10px rgba(0,0,0,.1);\n    margin-bottom:20px;\n}\n\nlabel{\n    display:block;\n    margin-top:12px;\n    font-weight:bold;\n}\n\ninput{\n    width:100%;\n    padding:10px;\n    margin-top:5px;\n    box-sizing:border-box;\n}\n\nbutton{\n    margin-top:20px;\n    padding:12px 20px;\n    background:#0066ff;\n    color:white;\n    border:none;\n    border-radius:8px;\n    cursor:pointer;\n}\n\nbutton:hover{\n    background:#004fd1;\n}\n\n.result{\n    margin-top:20px;\n    padding:15px;\n    background:#eef5ff;\n    border-radius:10px;\n}\n\ntable{\n    width:100%;\n    border-collapse:collapse;\n    margin-top:20px;\n}\n\nth,td{\n    padding:8px;\n    border-bottom:1px solid #ddd;\n    text-align:left;\n}\n\n.highlight{\n    background:#d4edda;\n    font-weight:bold;\n}\n<\/style>\n<\/head>\n<body>\n\n<div class=\"card\">\n    <h1>&#x26a1; Halvin latausaika<\/h1>\n\n    <label>Akun koko (kWh)<\/label>\n    <input id=\"batterySize\" type=\"number\" value=\"77\">\n\n    <label>Nykyinen varaustaso (%)<\/label>\n    <input id=\"currentSoc\" type=\"number\" value=\"20\">\n\n    <label>Tavoitevaraustaso (%)<\/label>\n    <input id=\"targetSoc\" type=\"number\" value=\"80\">\n\n    <label>Latausteho (kW)<\/label>\n    <input id=\"chargePower\" type=\"number\" value=\"11\">\n\n    <button onclick=\"calculate()\">Laske halvin aika<\/button>\n\n    <div id=\"result\" class=\"result\"><\/div>\n<\/div>\n\n<div class=\"card\">\n    <h2>Tulevat varttihinnat<\/h2>\n    <table>\n        <thead>\n        <tr>\n            <th>Aika<\/th>\n            <th>Hinta (c\/kWh)<\/th>\n        <\/tr>\n        <\/thead>\n        <tbody id=\"pricesTable\"><\/tbody>\n    <\/table>\n<\/div>\n\n<script>\n\nlet cachedPrices = [];\n\nasync function loadPrices(){\n\n    const response = await fetch(\"prices.php\");\n    const data = await response.json();\n\n    cachedPrices = data.prices;\n\n    const table = document.getElementById(\"pricesTable\");\n    table.innerHTML = \"\";\n\n    data.prices.forEach(item => {\n\n        table.innerHTML += `\n        <tr>\n            <td>${item.fiStart}<\/td>\n            <td>${item.price.toFixed(3)}<\/td>\n        <\/tr>`;\n    });\n}\n\nasync function calculate(){\n\n    if(cachedPrices.length === 0){\n        await loadPrices();\n    }\n\n    const batterySize =\n        parseFloat(document.getElementById(\"batterySize\").value);\n\n    const currentSoc =\n        parseFloat(document.getElementById(\"currentSoc\").value);\n\n    const targetSoc =\n        parseFloat(document.getElementById(\"targetSoc\").value);\n\n    const chargePower =\n        parseFloat(document.getElementById(\"chargePower\").value);\n\n    const energyNeeded =\n        batterySize * ((targetSoc - currentSoc) \/ 100);\n\n    const hoursNeeded =\n        energyNeeded \/ chargePower;\n\n    const quartersNeeded =\n        Math.ceil(hoursNeeded * 4);\n\n    let cheapestTotal = Infinity;\n    let cheapestIndex = -1;\n\n    for(let i=0; i<=cachedPrices.length-quartersNeeded; i++){\n\n        let sum = 0;\n\n        for(let j=0; j<quartersNeeded; j++){\n            sum += cachedPrices[i+j].price;\n        }\n\n        if(sum < cheapestTotal){\n            cheapestTotal = sum;\n            cheapestIndex = i;\n        }\n    }\n\n    if(cheapestIndex === -1){\n        document.getElementById(\"result\").innerHTML =\n            \"Ei tarpeeksi hintadataa.\";\n        return;\n    }\n\n    const start = cachedPrices[cheapestIndex];\n    const end =\n        cachedPrices[cheapestIndex + quartersNeeded - 1];\n\n    const average =\n        cheapestTotal \/ quartersNeeded;\n\n    document.getElementById(\"result\").innerHTML = `\n        <h3>&#x2705; Halvin latausjakso<\/h3>\n\n        <p><b>Lataustarve:<\/b>\n        ${energyNeeded.toFixed(1)} kWh<\/p>\n\n        <p><b>Latausaika:<\/b>\n        ${hoursNeeded.toFixed(2)} h<\/p>\n\n        <p><b>Alkaa:<\/b>\n        ${start.fiStart}<\/p>\n\n        <p><b>P\u00e4\u00e4ttyy:<\/b>\n        ${end.fiEnd}<\/p>\n\n        <p><b>Keskihinta:<\/b>\n        ${average.toFixed(3)} c\/kWh<\/p>\n    `;\n\n    highlightRows(cheapestIndex, quartersNeeded);\n}\n\nfunction highlightRows(start, length){\n\n    const rows =\n        document.querySelectorAll(\"#pricesTable tr\");\n\n    rows.forEach(row => row.classList.remove(\"highlight\"));\n\n    for(let i=start; i<start+length; i++){\n\n        if(rows[i]){\n            rows[i].classList.add(\"highlight\");\n        }\n    }\n}\n\nloadPrices();\n\n<\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to WordPress. This is your first post. Edit or delete it, then start writing! VirtaHinta.fi &#8211; EV-latauslaskuri &#x26a1; Halvin latausaika Akun koko (kWh) Nykyinen varaustaso (%) Tavoitevaraustaso (%) Latausteho (kW) Laske halvin aika Tulevat varttihinnat Aika Hinta (c\/kWh)<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/virtahinta.fi\/index.php?rest_route=\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/virtahinta.fi\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/virtahinta.fi\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/virtahinta.fi\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/virtahinta.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1"}],"version-history":[{"count":2,"href":"https:\/\/virtahinta.fi\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":8,"href":"https:\/\/virtahinta.fi\/index.php?rest_route=\/wp\/v2\/posts\/1\/revisions\/8"}],"wp:attachment":[{"href":"https:\/\/virtahinta.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/virtahinta.fi\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/virtahinta.fi\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}