{"id":3313,"date":"2026-01-15T08:37:16","date_gmt":"2026-01-15T08:37:16","guid":{"rendered":"https:\/\/test.innovacore.group\/?post_type=portfolio&#038;p=3313"},"modified":"2026-01-15T18:19:51","modified_gmt":"2026-01-15T18:19:51","slug":"alloenergy","status":"publish","type":"portfolio","link":"https:\/\/test.innovacore.group\/fr\/portfolio\/alloenergy\/","title":{"rendered":"alloenergy &#8211; Home Energy, Clarified"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">alloenergy brings radical transparency to domestic energy maintenance. Moving away from industry jargon and vague promises, they ensure solar panels and heat pumps perform to their full potential through continuous monitoring and rapid diagnostics. Their hybrid model combines digital simplicity for the user with rigorous, traceable field operations. By prioritizing proof and reactivity, alloenergy guarantees that equipment not only lasts but actively produces the energy it was designed for.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Transparent, tracked, and reliable maintenance for high-performing home energy systems.<\/p>\n","protected":false},"featured_media":2369,"parent":0,"template":"","meta":{"inline_featured_image":false,"company_name":"alloenergy","summary":"Home Energy, <span class=\"ic-nycd\">Clarified<\/span>","mission":"<p>To make energy maintenance intelligible and reliable. alloenergy aims to eliminate the ambiguity of post-installation care, ensuring equipment delivers on its promises. They empower homeowners with clear data and rapid solutions, maximizing energy utility while handling all technical complexities.<\/p>\n","impact":"<p>alloenergy is professionalizing the \"after-sales\" landscape of green energy. By shifting from reactive fixes to proactive, data-driven supervision, they directly convert potential technical failures into recoverable energy and financial savings. Their approach secures the ROI for homeowners and significantly extends the lifespan of sustainable infrastructure.<\/p>\n","company_logo":"https:\/\/test.innovacore.group\/wp-content\/uploads\/alloenergy-logo-innov-innovacore-optimized.jpg","website_url":"","linkedin_url":"","location":"Geneva, Switzerland","founded_year":"2026","key_numbers":{"item-0":{"metric_label":"kWh Recovered","metric_value":"953248"},"item-1":{"metric_label":".-CHF Losses Avoided","metric_value":"190"},"item-2":{"metric_label":"Tons CO\u00b2 Saved","metric_value":"76"}},"hiring_status":"hiring","sector":"energy","company_type":"enterprise","audience":["b2b_a_b2c"],"geo_scope":["continental"],"business_model":["subscription"],"funding_stage":"pre_seed","partnership_type":"creation","logo_animation":"<div id=\"alloenergy-particle-root\">\r\n    <canvas id=\"alloenergyCanvas\"><\/canvas>\r\n<\/div>\r\n\r\n<style>\r\n    #alloenergy-particle-root {\r\n        width: 100%;\r\n        height: 300px; \/* Hauteur fixe *\/\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        background: transparent;\r\n        overflow: hidden;\r\n        cursor: crosshair;\r\n    }\r\n<\/style>\r\n\r\n<script>\r\n(function() {\r\n    const canvas = document.getElementById('alloenergyCanvas');\r\n    const ctx = canvas.getContext('2d', { willReadFrequently: true });\r\n    const root = document.getElementById('alloenergy-particle-root');\r\n    \r\n    let width, height;\r\n    let particles = [];\r\n    let mouse = { x: -1000, y: -1000 };\r\n    const particleColor = '#f5f5f5'; \/\/ Gris clair Innovacore\r\n    let time = 0;\r\n\r\n    function init() {\r\n        width = root.offsetWidth;\r\n        height = 300;\r\n        \r\n        const dpr = window.devicePixelRatio || 1;\r\n        canvas.width = width * dpr;\r\n        canvas.height = height * dpr;\r\n        canvas.style.width = width + 'px';\r\n        canvas.style.height = height + 'px';\r\n        ctx.scale(dpr, dpr);\r\n\r\n        createLogoParticles();\r\n    }\r\n\r\n    function createLogoParticles() {\r\n        particles = [];\r\n        const cx = width \/ 2;\r\n        const cy = height \/ 2;\r\n        const isMobile = width < 600;\r\n\r\n        \/\/ --- 1. CONFIGURATION ---\r\n        \/\/ On dessine en blanc pur pour le scan\r\n        ctx.fillStyle = 'white';\r\n        ctx.strokeStyle = 'white';\r\n\r\n        \/\/ Dimensions relatives\r\n        const iconSize = isMobile ? 60 : 90;   \/\/ Taille du cercle\/ic\u00f4ne\r\n        const fontSize = isMobile ? 30 : 50;   \/\/ Taille du texte\r\n        const gap = isMobile ? 15 : 25;        \/\/ Espace vertical Icone <-> Texte\r\n\r\n        \/\/ Centrage vertical global\r\n        \/\/ Hauteur totale = Icone + Gap + Texte\r\n        const totalContentHeight = iconSize + gap + fontSize;\r\n        const startY = (height - totalContentHeight) \/ 2 + (iconSize \/ 2); \/\/ Centre de l'ic\u00f4ne\r\n\r\n        \/\/ --- 2. DESSIN DE L'IC\u00d4NE (Cercle travers\u00e9 par l'\u00e9clair) ---\r\n        const ix = cx;\r\n        const iy = startY;\r\n        const r = iconSize \/ 2;\r\n\r\n        \/\/ A. Le Cercle de base (l'anneau \u00e9pais)\r\n        ctx.beginPath();\r\n        ctx.arc(ix, iy, r, 0, Math.PI * 2);\r\n        ctx.fill();\r\n\r\n        \/\/ B. L'\u00c9clair en espace n\u00e9gatif (Gomme)\r\n        ctx.globalCompositeOperation = 'destination-out';\r\n        ctx.lineCap = 'round';\r\n        ctx.lineJoin = 'round';\r\n        ctx.lineWidth = iconSize * 0.18; \/\/ \u00c9paisseur de la coupure\r\n\r\n        ctx.beginPath();\r\n        \/\/ On dessine un Z stylis\u00e9 qui traverse le cercle\r\n        \/\/ Point bas gauche\r\n        ctx.moveTo(ix - r * 0.6, iy + r * 0.6);\r\n        \/\/ Vers le centre (l\u00e9g\u00e8rement d\u00e9cal\u00e9)\r\n        ctx.lineTo(ix - r * 0.1, iy + r * 0.1);\r\n        \/\/ Petit d\u00e9crochement horizontal vers la gauche pour le style \u00e9clair\r\n        ctx.lineTo(ix + r * 0.1, iy - r * 0.1);\r\n        \/\/ Point haut droit\r\n        ctx.lineTo(ix + r * 0.6, iy - r * 0.6);\r\n        ctx.stroke();\r\n        \r\n        \/\/ Retour au mode normal pour le texte\r\n        ctx.globalCompositeOperation = 'source-over';\r\n\r\n\r\n        \/\/ --- 3. DESSIN DU TEXTE \"alloenergy\" ---\r\n        const textY = iy + r + gap + (fontSize \/ 2);\r\n        \r\n        ctx.textAlign = 'center';\r\n        ctx.textBaseline = 'middle';\r\n        \/\/ Police g\u00e9om\u00e9trique arrondie proche du logo (Montserrat, Poppins, ou Arial Rounded)\r\n        ctx.font = `bold ${fontSize}px \"Montserrat\", \"Poppins\", \"Arial Rounded MT Bold\", sans-serif`;\r\n        \r\n        \/\/ Comme tout est de la m\u00eame couleur en particules, on \u00e9crit tout le mot d'un coup\r\n        ctx.fillStyle = 'white';\r\n        ctx.fillText('alloenergy', cx, textY);\r\n\r\n\r\n        \/\/ --- 4. SCAN DES PIXELS ---\r\n        \/\/ Densit\u00e9 4 pour la s\u00e9curit\u00e9 et la fluidit\u00e9\r\n        const density = 4;\r\n        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;\r\n        const dataWidth = canvas.width; \r\n\r\n        for (let y = 0; y < canvas.height; y += density) {\r\n            for (let x = 0; x < canvas.width; x += density) {\r\n                if (imageData[(y * dataWidth + x) * 4 + 3] > 128) {\r\n                    const dpr = window.devicePixelRatio || 1;\r\n                    particles.push({\r\n                        x: x \/ dpr,\r\n                        y: y \/ dpr,\r\n                        originX: x \/ dpr,\r\n                        originY: y \/ dpr,\r\n                        vx: 0, \r\n                        vy: 0,\r\n                        size: Math.random() * 1.5 + 0.5,\r\n                    });\r\n                }\r\n            }\r\n        }\r\n        \r\n        ctx.clearRect(0, 0, width, height);\r\n    }\r\n\r\n    function draw() {\r\n        ctx.clearRect(0, 0, width, height);\r\n        \r\n        \/\/ --- PHYSIQUE DOUCE (Slow & Smooth) ---\r\n        time += 0.02; \/\/ Vitesse d'ondulation lente\r\n\r\n        ctx.fillStyle = particleColor;\r\n        \r\n        particles.forEach(p => {\r\n            \/\/ Ondulation\r\n            const waveX = Math.sin(time * 0.5 + p.y * 0.05) * 2;\r\n            const waveY = Math.cos(time * 0.3 + p.x * 0.05) * 2;\r\n            \r\n            \/\/ Interaction Souris\r\n            const dx = mouse.x - p.x;\r\n            const dy = mouse.y - p.y;\r\n            const dist = Math.sqrt(dx*dx + dy*dy);\r\n            const radius = 80;\r\n            \r\n            let repelX = 0;\r\n            let repelY = 0;\r\n\r\n            if (dist < radius) {\r\n                const force = (radius - dist) \/ radius;\r\n                const angle = Math.atan2(dy, dx);\r\n                \/\/ R\u00e9pulsion tr\u00e8s douce (force 8)\r\n                repelX = -Math.cos(angle) * force * 8;\r\n                repelY = -Math.sin(angle) * force * 8;\r\n            }\r\n\r\n            const targetX = p.originX + waveX;\r\n            const targetY = p.originY + waveY;\r\n\r\n            \/\/ Retour tr\u00e8s souple (0.03)\r\n            const ax = (targetX - p.x) * 0.03;\r\n            const ay = (targetY - p.y) * 0.03;\r\n\r\n            p.vx += ax;\r\n            p.vy += ay;\r\n            p.vx += repelX * 0.3;\r\n            p.vy += repelY * 0.3;\r\n            \r\n            \/\/ Friction \u00e9lev\u00e9e pour glisser (0.90)\r\n            p.vx *= 0.90; \r\n            p.vy *= 0.90;\r\n\r\n            p.x += p.vx;\r\n            p.y += p.vy;\r\n\r\n            ctx.beginPath();\r\n            ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\r\n            ctx.fill();\r\n        });\r\n\r\n        requestAnimationFrame(draw);\r\n    }\r\n\r\n    const updateMouse = (e) => {\r\n        const r = canvas.getBoundingClientRect();\r\n        const cx = e.touches ? e.touches[0].clientX : e.clientX;\r\n        const cy = e.touches ? e.touches[0].clientY : e.clientY;\r\n        mouse.x = cx - r.left;\r\n        mouse.y = cy - r.top;\r\n    };\r\n\r\n    window.addEventListener('resize', init);\r\n    canvas.addEventListener('mousemove', updateMouse);\r\n    canvas.addEventListener('touchmove', updateMouse, {passive: true});\r\n    canvas.addEventListener('mouseleave', () => { mouse.x = -1000; mouse.y = -1000; });\r\n    canvas.addEventListener('touchend', () => { mouse.x = -1000; mouse.y = -1000; });\r\n\r\n    \/\/ D\u00e9lai de s\u00e9curit\u00e9 pour le chargement des polices\r\n    setTimeout(init, 100);\r\n    draw();\r\n})();\r\n<\/script>"},"pt":[],"pipeline":[34],"class_list":["post-3313","portfolio","type-portfolio","status-publish","has-post-thumbnail","hentry","pipeline-innov"],"_links":{"self":[{"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/portfolio\/3313","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/portfolio"}],"about":[{"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/types\/portfolio"}],"version-history":[{"count":3,"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/portfolio\/3313\/revisions"}],"predecessor-version":[{"id":3493,"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/portfolio\/3313\/revisions\/3493"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/media\/2369"}],"wp:attachment":[{"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/media?parent=3313"}],"wp:term":[{"taxonomy":"pt","embeddable":true,"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/pt?post=3313"},{"taxonomy":"pipeline","embeddable":true,"href":"https:\/\/test.innovacore.group\/fr\/wp-json\/wp\/v2\/pipeline?post=3313"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}