{"id":22,"date":"2026-05-27T19:07:37","date_gmt":"2026-05-27T19:07:37","guid":{"rendered":"https:\/\/nade.fi\/?page_id=22"},"modified":"2026-05-28T00:07:56","modified_gmt":"2026-05-28T00:07:56","slug":"ouman-tilastot","status":"publish","type":"page","link":"https:\/\/nade.fi\/index.php\/ouman-tilastot\/","title":{"rendered":"Ouman Tilastot"},"content":{"rendered":"\n<div id=\"suojattu_sisalto\" style=\"display:none;\">\n    <div style=\"font-family:sans-serif; max-width:1000px; margin:20px auto; padding:25px; background:#fff; border-radius:12px; box-shadow:0 4px 15px rgba(0,0,0,0.05);\">\n        <div style=\"text-align:center; margin-bottom:25px;\">\n            <h2 style=\"margin:0; color:#2c3e50;\">Kiinteist\u00f6n L\u00e4mp\u00f6tilatilastot<\/h2>\n            <p id=\"lataus_tila\" style=\"color:#666;\">Valmis vastaanottamaan Ouman CSV- \/ teksti-dataa<\/p>\n        <\/div>\n\n        <div style=\"background:#f8f9fa; padding:15px; border-radius:8px; margin-bottom:25px; border:1px solid #e0e0e0;\">\n            <label style=\"font-weight:bold; display:block; margin-bottom:8px;\">Kopioi ja liit\u00e4 Ouman-rivit (teksti tai CSV) t\u00e4h\u00e4n laatikkoon:<\/label>\n            <textarea id=\"sms_input\" style=\"width:100%; height:150px; padding:10px; border:1px solid #ccc; border-radius:6px; font-family:monospace;\" placeholder=\"Liit\u00e4 t\u00e4h\u00e4n...\"><\/textarea>\n            <button onclick=\"lueDataSivulle()\" style=\"background:#2980b9; color:white; border:none; padding:12px; border-radius:4px; font-weight:bold; cursor:pointer; width:100%; margin-top:10px; font-size:1rem;\">P\u00e4ivit\u00e4 tiedot kuvaajaan<\/button>\n        <\/div>\n\n        <div style=\"display:flex; justify-content:center; gap:10px; margin-bottom:20px; flex-wrap:wrap;\">\n            <button class=\"btn-suodatin aktiivinen\" onclick=\"vaihdaNakyma('paiva', this)\">P\u00e4iv\u00e4taso<\/button>\n            <button class=\"btn-suodatin\" onclick=\"vaihdaNakyma('viikko', this)\">Viikkotaso<\/button>\n            <button class=\"btn-suodatin\" onclick=\"vaihdaNakyma('kuukausi', this)\">Kuukausitaso<\/button>\n            <button class=\"btn-suodatin\" onclick=\"vaihdaNakyma('vuosi', this)\">Vuositaso<\/button>\n        <\/div>\n\n        <div style=\"position:relative; height:480px; width:100%;\">\n            <canvas id=\"oumanChart\"><\/canvas>\n        <\/div>\n    <\/div>\n<\/div>\n\n<style>\n    .btn-suodatin { background:#eaeaea; border:none; padding:8px 16px; border-radius:20px; cursor:pointer; font-weight:500; }\n    .btn-suodatin.aktiivinen { background:#2c3e50; color:white; }\n<\/style>\n\n<script>\nlet rakaData = {};\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n    let oikeaSalasana = \"Honkatie2026\"; \n    let syotettySalasana = prompt(\"Sy\u00f6t\u00e4 yll\u00e4pidon salasana:\");\n    \n    if (syotettySalasana === oikeaSalasana) {\n        document.getElementById(\"suojattu_sisalto\").style.display = \"block\";\n        alustaYksinkertainenKuvaaja();\n    } else {\n        alert(\"V\u00e4\u00e4r\u00e4 salasana.\");\n        window.location.href = \"https:\/\/nade.fi\";\n    }\n});\n\nfunction alustaYksinkertainenKuvaaja() {\n    const canvas = document.getElementById('oumanChart');\n    if (!canvas) return;\n    const ctx = canvas.getContext('2d');\n    canvas.width = canvas.parentElement.clientWidth;\n    canvas.height = canvas.parentElement.clientHeight;\n    \n    ctx.fillStyle = \"#ffffff\";\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n    \n    ctx.font = \"16px sans-serif\";\n    ctx.fillStyle = \"#888\";\n    ctx.textAlign = \"center\";\n    ctx.fillText(\"Liit\u00e4 Ouman-data yl\u00e4puolelle piirt\u00e4\u00e4ksesi k\u00e4yr\u00e4t.\", canvas.width \/ 2, 200);\n}\n\nfunction lueDataSivulle() {\n    let teksti = document.getElementById('sms_input').value;\n    if(!teksti.trim()) return alert(\"Sy\u00f6t\u00e4 ensin teksti\u00e4!\");\n\n    let rivit = teksti.split('\\n');\n    let luetutRivit = 0;\n\n    for (let i = 0; i < rivit.length; i++) {\n        let rivi = rivit[i];\n        \n        \/\/ JOUSTAVA LUKIJA: Etsit\u00e4\u00e4n arvot riippumatta siit\u00e4, onko \/ merkki kiinni luvussa vai ei\n        let ulkoMatch = rivi.match(\/Ulkol\u00e4mp\u00f6\\s*=\\s*(-?\\d+)\/i);\n        let menoMatch = rivi.match(\/Menovesi\\s*=\\s*(-?\\d+)\/i);\n        let paluuMatch = rivi.match(\/Paluuvesi\\s*=\\s*(-?\\d+)\/i); \/\/ LIS\u00c4TTY PALUUVESI\n        \n        if (ulkoMatch || menoMatch || paluuMatch) {\n            let pvmMatch = rivi.match(\/(\\d{1,2})\\.(\\d{1,2})\\.(\\d{4})\/);\n            if (pvmMatch) {\n                let paiva = parseInt(pvmMatch[1], 10);\n                let kuukausi = parseInt(pvmMatch[2], 10);\n                let vuosi = parseInt(pvmMatch[3], 10);\n                let avain = paiva + \".\" + kuukausi + \".\" + vuosi;\n                \n                if (!rakaData[avain]) {\n                    rakaData[avain] = { ulko: null, meno: null, paluu: null, dateObj: new Date(vuosi, kuukausi - 1, paiva) };\n                }\n                \n                if (ulkoMatch) rakaData[avain].ulko = parseFloat(ulkoMatch[1]);\n                if (menoMatch) rakaData[avain].meno = parseFloat(menoMatch[1]);\n                if (paluuMatch) rakaData[avain].paluu = parseFloat(paluuMatch[1]);\n                luetutRivit++;\n            }\n        }\n    }\n    \n    piirraGraafi('paiva');\n    document.getElementById('sms_input').value = \"\";\n    document.getElementById('lataus_tila').innerText = `Ladattu ${Object.keys(rakaData).length} p\u00e4iv\u00e4n Ouman-tilastot j\u00e4rjestelm\u00e4\u00e4n.`;\n    alert(`Ajo suoritettu! Onnistuneesti analysoitu ${luetutRivit} mittauspistett\u00e4.`);\n}\n\nfunction piirraGraafi(taso) {\n    const canvas = document.getElementById('oumanChart');\n    if (!canvas) return;\n    const ctx = canvas.getContext('2d');\n    \n    canvas.width = canvas.parentElement.clientWidth;\n    canvas.height = canvas.parentElement.clientHeight;\n\n    let dataTaulukko = Object.values(rakaData);\n    dataTaulukko.sort((a, b) => a.dateObj - b.dateObj);\n    if(dataTaulukko.length === 0) return;\n\n    ctx.fillStyle = \"#ffffff\";\n    ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n    let leveys = canvas.width - 100;\n    let korkeus = canvas.height - 80;\n    let askelX = leveys \/ (dataTaulukko.length > 1 ? dataTaulukko.length - 1 : 1);\n\n    let minAste = -20;\n    let maxAste = 60;\n    let asteSkaala = korkeus \/ (maxAste - minAste);\n\n    function haeY(arvo) {\n        if(arvo === null || isNaN(arvo)) return null;\n        return korkeus - ((arvo - minAste) * asteSkaala) + 30;\n    }\n\n    \/\/ Taustaruudukko\n    ctx.strokeStyle = \"#f0f0f0\";\n    ctx.lineWidth = 1;\n    ctx.fillStyle = \"#666\";\n    ctx.font = \"12px sans-serif\";\n    ctx.textAlign = \"right\";\n    \n    for(let a = minAste; a <= maxAste; a += 10) {\n        let y = haeY(a);\n        ctx.beginPath();\n        ctx.moveTo(60, y);\n        ctx.lineTo(canvas.width - 40, y);\n        ctx.stroke();\n        ctx.fillText(a + \"\u00b0C\", 50, y + 4);\n    }\n\n    \/\/ Piirret\u00e4\u00e4n Ulkol\u00e4mp\u00f6tila (Sininen viiva)\n    ctx.strokeStyle = \"#2980b9\";\n    ctx.lineWidth = 3;\n    ctx.beginPath();\n    let eka = true;\n    dataTaulukko.forEach((d, index) => {\n        let y = haeY(d.ulko);\n        if(y !== null) {\n            let x = 70 + (index * askelX);\n            if(eka) { ctx.moveTo(x, y); eka = false; }\n            else { ctx.lineTo(x, y); }\n        }\n    });\n    ctx.stroke();\n\n    \/\/ Piirret\u00e4\u00e4n L1 Menovesi (Oranssi viiva)\n    ctx.strokeStyle = \"#e67e22\";\n    ctx.lineWidth = 3;\n    ctx.beginPath();\n    eka = true;\n    dataTaulukko.forEach((d, index) => {\n        let y = haeY(d.meno);\n        if(y !== null) {\n            let x = 70 + (index * askelX);\n            if(eka) { ctx.moveTo(x, y); eka = false; }\n            else { ctx.lineTo(x, y); }\n        }\n    });\n    ctx.stroke();\n\n    \/\/ Piirret\u00e4\u00e4n L1 Paluuvesi (Harmaa\/Tummansininen viiva)\n    ctx.strokeStyle = \"#7f8c8d\";\n    ctx.lineWidth = 2;\n    ctx.beginPath();\n    eka = true;\n    dataTaulukko.forEach((d, index) => {\n        let y = haeY(d.paluu);\n        if(y !== null) {\n            let x = 70 + (index * askelX);\n            if(eka) { ctx.moveTo(x, y); eka = false; }\n            else { ctx.lineTo(x, y); }\n        }\n    });\n    ctx.stroke();\n\n    \/\/ Piirret\u00e4\u00e4n selitteet yl\u00e4kulmaan\n    ctx.textAlign = \"left\";\n    ctx.fillStyle = \"#2980b9\"; ctx.fillText(\"\u25a0 Ulkol\u00e4mp\u00f6\", 70, 20);\n    ctx.fillStyle = \"#e67e22\"; ctx.fillText(\"\u25a0 Menovesi\", 170, 20);\n    ctx.fillStyle = \"#7f8c8d\"; ctx.fillText(\"\u25a0 Paluuvesi\", 270, 20);\n}\n\nfunction vaihdaNakyma(taso, painike) {\n    document.querySelectorAll('.btn-suodatin').forEach(b => b.classList.remove('aktiivinen'));\n    painike.classList.add('aktiivinen');\n    piirraGraafi(taso);\n}\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Kiinteist\u00f6n L\u00e4mp\u00f6tilatilastot Valmis vastaanottamaan Ouman CSV- \/ teksti-dataa Kopioi ja liit\u00e4 Ouman-rivit (teksti tai CSV) t\u00e4h\u00e4n laatikkoon: P\u00e4ivit\u00e4 tiedot kuvaajaan P\u00e4iv\u00e4taso Viikkotaso Kuukausitaso Vuositaso<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-22","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/pages\/22","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/comments?post=22"}],"version-history":[{"count":20,"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/pages\/22\/revisions"}],"predecessor-version":[{"id":51,"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/pages\/22\/revisions\/51"}],"wp:attachment":[{"href":"https:\/\/nade.fi\/index.php\/wp-json\/wp\/v2\/media?parent=22"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}