hass.tibber_prices/developer/intro.html
github-actions[bot] e9aea64a2e deploy: 6898c126e3
2025-12-06 01:42:39 +00:00

138 lines
No EOL
40 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-intro" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">Developer Documentation | Tibber Prices - Developer Guide</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://jpawlowski.github.io/hass.tibber_prices/developer/img/social-card.png"><meta data-rh="true" name="twitter:image" content="https://jpawlowski.github.io/hass.tibber_prices/developer/img/social-card.png"><meta data-rh="true" property="og:url" content="https://jpawlowski.github.io/hass.tibber_prices/developer/intro"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="Developer Documentation | Tibber Prices - Developer Guide"><meta data-rh="true" name="description" content="This section contains documentation for contributors and maintainers of the Tibber Prices custom integration."><meta data-rh="true" property="og:description" content="This section contains documentation for contributors and maintainers of the Tibber Prices custom integration."><link data-rh="true" rel="icon" href="/hass.tibber_prices/developer/img/logo.svg"><link data-rh="true" rel="canonical" href="https://jpawlowski.github.io/hass.tibber_prices/developer/intro"><link data-rh="true" rel="alternate" href="https://jpawlowski.github.io/hass.tibber_prices/developer/intro" hreflang="en"><link data-rh="true" rel="alternate" href="https://jpawlowski.github.io/hass.tibber_prices/developer/intro" hreflang="x-default"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Developer Documentation","item":"https://jpawlowski.github.io/hass.tibber_prices/developer/intro"}]}</script><link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&amp;family=Space+Grotesk:wght@500;600;700&amp;display=swap"><link rel="stylesheet" href="/hass.tibber_prices/developer/assets/css/styles.be4f3d68.css">
<script src="/hass.tibber_prices/developer/assets/js/runtime~main.09b7b31a.js" defer="defer"></script>
<script src="/hass.tibber_prices/developer/assets/js/main.5eb4cf38.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><link rel="preload" as="image" href="/hass.tibber_prices/developer/img/logo.svg"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/hass.tibber_prices/developer/"><div class="navbar__logo"><img src="/hass.tibber_prices/developer/img/logo.svg" alt="Tibber Prices Integration Logo" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/hass.tibber_prices/developer/img/logo.svg" alt="Tibber Prices Integration Logo" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div><b class="navbar__title text--truncate">Tibber Prices HA</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/hass.tibber_prices/developer/intro">Developer Guide</a><a href="https://jpawlowski.github.io/hass.tibber_prices/user/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">User Docs<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/hass.tibber_prices/developer/intro">Next 🚧</a><a href="https://github.com/jpawlowski/hass.tibber_prices" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="navbar__search"><span aria-label="expand searchbar" role="button" class="search-icon" tabindex="0"></span><input id="search_input_react" type="search" placeholder="Loading..." aria-label="Search" class="navbar__search-input search-bar" disabled=""></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/hass.tibber_prices/developer/intro"><span title="Developer Documentation" class="linkLabel_WmDU">Developer Documentation</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/architecture"><span title="🏗️ Architecture" class="categoryLinkLabel_W154">🏗️ Architecture</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/architecture"><span title="Architecture" class="linkLabel_WmDU">Architecture</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/timer-architecture"><span title="Timer Architecture" class="linkLabel_WmDU">Timer Architecture</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/caching-strategy"><span title="Caching Strategy" class="linkLabel_WmDU">Caching Strategy</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/api-reference"><span title="API Reference" class="linkLabel_WmDU">API Reference</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/setup"><span title="💻 Development" class="categoryLinkLabel_W154">💻 Development</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/setup"><span title="Development Setup" class="linkLabel_WmDU">Development Setup</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/coding-guidelines"><span title="Coding Guidelines" class="linkLabel_WmDU">Coding Guidelines</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/critical-patterns"><span title="Critical Behavior Patterns - Testing Guide" class="linkLabel_WmDU">Critical Behavior Patterns - Testing Guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/debugging"><span title="Debugging Guide" class="linkLabel_WmDU">Debugging Guide</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/period-calculation-theory"><span title="📐 Advanced Topics" class="categoryLinkLabel_W154">📐 Advanced Topics</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/period-calculation-theory"><span title="Period Calculation Theory" class="linkLabel_WmDU">Period Calculation Theory</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/refactoring-guide"><span title="Refactoring Guide" class="linkLabel_WmDU">Refactoring Guide</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/performance"><span title="Performance Optimization" class="linkLabel_WmDU">Performance Optimization</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/contributing"><span title="📝 Contributing" class="categoryLinkLabel_W154">📝 Contributing</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/contributing"><span title="Contributing Guide" class="linkLabel_WmDU">Contributing Guide</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="true" href="/hass.tibber_prices/developer/release-management"><span title="🚀 Release" class="categoryLinkLabel_W154">🚀 Release</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/release-management"><span title="Release Notes Generation" class="linkLabel_WmDU">Release Notes Generation</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/hass.tibber_prices/developer/testing"><span title="Testing" class="linkLabel_WmDU">Testing</span></a></li></ul></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="theme-doc-version-banner alert alert--warning margin-bottom--md" role="alert"><div>This is unreleased documentation for <!-- -->Tibber Prices - Developer Guide<!-- --> <b>Next 🚧</b> version.</div><div class="margin-top--md">For up-to-date documentation, see the <b><a href="/hass.tibber_prices/developer/intro">latest version</a></b> (<!-- -->Next 🚧<!-- -->).</div></div><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/hass.tibber_prices/developer/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Developer Documentation</span></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: Next 🚧</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Developer Documentation</h1></header>
<p>This section contains documentation for contributors and maintainers of the <strong>Tibber Prices custom integration</strong>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>Community Project</div><div class="admonitionContent_BuS1"><p>This is an independent, community-maintained custom integration for Home Assistant. It is <strong>not</strong> an official Tibber product and is <strong>not</strong> affiliated with Tibber AS.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-developer-guides">📚 Developer Guides<a href="#-developer-guides" class="hash-link" aria-label="Direct link to 📚 Developer Guides" title="Direct link to 📚 Developer Guides" translate="no"></a></h2>
<ul>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/setup">Setup</a></strong> - DevContainer, environment setup, and dependencies</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/architecture">Architecture</a></strong> - Code structure, patterns, and conventions</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/period-calculation-theory">Period Calculation Theory</a></strong> - Mathematical foundations, Flex/Distance interaction, Relaxation strategy</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/timer-architecture">Timer Architecture</a></strong> - Timer system, scheduling, coordination (3 independent timers)</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/caching-strategy">Caching Strategy</a></strong> - Cache layers, invalidation, debugging</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/testing">Testing</a></strong> - How to run tests and write new test cases</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/release-management">Release Management</a></strong> - Release workflow and versioning process</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/coding-guidelines">Coding Guidelines</a></strong> - Style guide, linting, and best practices</li>
<li class=""><strong><a class="" href="/hass.tibber_prices/developer/refactoring-guide">Refactoring Guide</a></strong> - How to plan and execute major refactorings</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-ai-documentation">🤖 AI Documentation<a href="#-ai-documentation" class="hash-link" aria-label="Direct link to 🤖 AI Documentation" title="Direct link to 🤖 AI Documentation" translate="no"></a></h2>
<p>The main AI/Copilot documentation is in <a href="https://github.com/jpawlowski/hass.tibber_prices/blob/v0.20.0/AGENTS.md" target="_blank" rel="noopener noreferrer" class=""><code>AGENTS.md</code></a>. This file serves as long-term memory for AI assistants and contains:</p>
<ul>
<li class="">Detailed architectural patterns</li>
<li class="">Code quality rules and conventions</li>
<li class="">Development workflow guidance</li>
<li class="">Common pitfalls and anti-patterns</li>
<li class="">Project-specific patterns and utilities</li>
</ul>
<p><strong>Important:</strong> When proposing changes to patterns or conventions, always update <a href="https://github.com/jpawlowski/hass.tibber_prices/blob/v0.20.0/AGENTS.md" target="_blank" rel="noopener noreferrer" class=""><code>AGENTS.md</code></a> to keep AI guidance consistent.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-assisted-development">AI-Assisted Development<a href="#ai-assisted-development" class="hash-link" aria-label="Direct link to AI-Assisted Development" title="Direct link to AI-Assisted Development" translate="no"></a></h3>
<p>This integration is developed with extensive AI assistance (GitHub Copilot, Claude, and other AI tools). The AI handles:</p>
<ul>
<li class=""><strong>Pattern Recognition</strong>: Understanding and applying Home Assistant best practices</li>
<li class=""><strong>Code Generation</strong>: Implementing features with proper type hints, error handling, and documentation</li>
<li class=""><strong>Refactoring</strong>: Maintaining consistency across the codebase during structural changes</li>
<li class=""><strong>Translation Management</strong>: Keeping 5 language files synchronized</li>
<li class=""><strong>Documentation</strong>: Generating and maintaining comprehensive documentation</li>
</ul>
<p><strong>Quality Assurance:</strong></p>
<ul>
<li class="">Automated linting with Ruff (120-char line length, max complexity 25)</li>
<li class="">Home Assistant&#x27;s type checking and validation</li>
<li class="">Real-world testing in development environment</li>
<li class="">Code review by maintainer before merging</li>
</ul>
<p><strong>Benefits:</strong></p>
<ul>
<li class="">Rapid feature development while maintaining quality</li>
<li class="">Consistent code patterns across all modules</li>
<li class="">Comprehensive documentation maintained alongside code</li>
<li class="">Quick bug fixes with proper understanding of context</li>
</ul>
<p><strong>Limitations:</strong></p>
<ul>
<li class="">AI may occasionally miss edge cases or subtle bugs</li>
<li class="">Some complex Home Assistant patterns may need human review</li>
<li class="">Translation quality depends on AI&#x27;s understanding of target language</li>
<li class="">User feedback is crucial for discovering real-world issues</li>
</ul>
<p>If you&#x27;re working with AI tools on this project, the <a href="https://github.com/jpawlowski/hass.tibber_prices/blob/v0.20.0/AGENTS.md" target="_blank" rel="noopener noreferrer" class=""><code>AGENTS.md</code></a> file provides the context and patterns that ensure consistency.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-quick-start-for-contributors">🚀 Quick Start for Contributors<a href="#-quick-start-for-contributors" class="hash-link" aria-label="Direct link to 🚀 Quick Start for Contributors" title="Direct link to 🚀 Quick Start for Contributors" translate="no"></a></h2>
<ol>
<li class=""><strong>Fork and clone</strong> the repository</li>
<li class=""><strong>Open in DevContainer</strong> (VS Code: &quot;Reopen in Container&quot;)</li>
<li class=""><strong>Run setup</strong>: <code>./scripts/setup/setup</code> (happens automatically via <code>postCreateCommand</code>)</li>
<li class=""><strong>Start development environment</strong>: <code>./scripts/develop</code></li>
<li class=""><strong>Make your changes</strong> following the <a class="" href="/hass.tibber_prices/developer/coding-guidelines">Coding Guidelines</a></li>
<li class=""><strong>Run linting</strong>: <code>./scripts/lint</code></li>
<li class=""><strong>Validate integration</strong>: <code>./scripts/release/hassfest</code></li>
<li class=""><strong>Test your changes</strong> in the running Home Assistant instance</li>
<li class=""><strong>Commit using Conventional Commits</strong> format</li>
<li class=""><strong>Open a Pull Request</strong> with clear description</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-development-tools">🛠️ Development Tools<a href="#-development-tools" class="hash-link" aria-label="Direct link to 🛠️ Development Tools" title="Direct link to 🛠️ Development Tools" translate="no"></a></h2>
<p>The project includes several helper scripts in <code>./scripts/</code>:</p>
<ul>
<li class=""><code>bootstrap</code> - Initial setup of dependencies</li>
<li class=""><code>develop</code> - Start Home Assistant in debug mode (auto-cleans .egg-info)</li>
<li class=""><code>clean</code> - Remove build artifacts and caches</li>
<li class=""><code>lint</code> - Auto-fix code issues with ruff</li>
<li class=""><code>lint-check</code> - Check code without modifications (CI mode)</li>
<li class=""><code>hassfest</code> - Validate integration structure (JSON, Python syntax, required files)</li>
<li class=""><code>setup</code> - Install development tools (git-cliff, @github/copilot)</li>
<li class=""><code>prepare-release</code> - Prepare a new release (bump version, create tag)</li>
<li class=""><code>generate-release-notes</code> - Generate release notes from commits</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-project-structure">📦 Project Structure<a href="#-project-structure" class="hash-link" aria-label="Direct link to 📦 Project Structure" title="Direct link to 📦 Project Structure" translate="no"></a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">custom_components/tibber_prices/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── __init__.py # Integration setup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── coordinator.py # Data update coordinator with caching</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── api.py # Tibber GraphQL API client</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── price_utils.py # Price enrichment functions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── average_utils.py # Average calculation utilities</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── sensor/ # Sensor platform (package)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── __init__.py # Platform setup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── core.py # TibberPricesSensor class</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── definitions.py # Entity descriptions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── helpers.py # Pure helper functions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ └── attributes.py # Attribute builders</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── binary_sensor.py # Binary sensor platform</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── entity_utils/ # Shared entity helpers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── icons.py # Icon mapping logic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ ├── colors.py # Color mapping logic</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ └── attributes.py # Common attribute builders</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── services.py # Custom services</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── config_flow.py # UI configuration flow</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── const.py # Constants and helpers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── translations/ # Standard HA translations</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── custom_translations/ # Extended translations (descriptions)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-key-concepts">🔍 Key Concepts<a href="#-key-concepts" class="hash-link" aria-label="Direct link to 🔍 Key Concepts" title="Direct link to 🔍 Key Concepts" translate="no"></a></h2>
<p><strong>DataUpdateCoordinator Pattern:</strong></p>
<ul>
<li class="">Centralized data fetching and caching</li>
<li class="">Automatic entity updates on data changes</li>
<li class="">Persistent storage via <code>Store</code></li>
<li class="">Quarter-hour boundary refresh scheduling</li>
</ul>
<p><strong>Price Data Enrichment:</strong></p>
<ul>
<li class="">Raw API data is enriched with statistical analysis</li>
<li class="">Trailing/leading 24h averages calculated per interval</li>
<li class="">Price differences and ratings added</li>
<li class="">All via pure functions in <code>price_utils.py</code></li>
</ul>
<p><strong>Translation System:</strong></p>
<ul>
<li class="">Dual system: <code>/translations/</code> (HA schema) + <code>/custom_translations/</code> (extended)</li>
<li class="">Both must stay in sync across all languages (de, en, nb, nl, sv)</li>
<li class="">Async loading at integration setup</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-testing">🧪 Testing<a href="#-testing" class="hash-link" aria-label="Direct link to 🧪 Testing" title="Direct link to 🧪 Testing" translate="no"></a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># Validate integration structure</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/release/hassfest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Run all tests</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pytest tests/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Run specific test file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pytest tests/test_coordinator.py</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Run with coverage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pytest </span><span class="token parameter variable" style="color:#36acaa">--cov</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">custom_components.tibber_prices tests/</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-documentation-standards">📝 Documentation Standards<a href="#-documentation-standards" class="hash-link" aria-label="Direct link to 📝 Documentation Standards" title="Direct link to 📝 Documentation Standards" translate="no"></a></h2>
<ul>
<li class=""><strong>User-facing docs</strong> go in <code>docs/user/</code></li>
<li class=""><strong>Developer docs</strong> go in <code>docs/development/</code></li>
<li class=""><strong>AI guidance</strong> goes in <code>AGENTS.md</code></li>
<li class="">Use clear examples and code snippets</li>
<li class="">Keep docs up-to-date with code changes</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-contributing">🤝 Contributing<a href="#-contributing" class="hash-link" aria-label="Direct link to 🤝 Contributing" title="Direct link to 🤝 Contributing" translate="no"></a></h2>
<p>See <a href="https://github.com/jpawlowski/hass.tibber_prices/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener noreferrer" class="">CONTRIBUTING.md</a> for detailed contribution guidelines, code of conduct, and pull request process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-license">📄 License<a href="#-license" class="hash-link" aria-label="Direct link to 📄 License" title="Direct link to 📄 License" translate="no"></a></h2>
<p>This project is licensed under the <a href="https://github.com/jpawlowski/hass.tibber_prices/blob/main/LICENSE" target="_blank" rel="noopener noreferrer" class="">Apache License 2.0</a>.</p>
<hr>
<p><strong>Note:</strong> This documentation is for developers. End users should refer to the <a href="https://jpawlowski.github.io/hass.tibber_prices/user/" target="_blank" rel="noopener noreferrer" class="">User Documentation</a>.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://github.com/jpawlowski/hass.tibber_prices/tree/main/docs/developer/docs/intro.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2025-12-06T01:37:06.000Z" itemprop="dateModified">Dec 6, 2025</time></b></span></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--next" href="/hass.tibber_prices/developer/architecture"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Architecture</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#-developer-guides" class="table-of-contents__link toc-highlight">📚 Developer Guides</a></li><li><a href="#-ai-documentation" class="table-of-contents__link toc-highlight">🤖 AI Documentation</a><ul><li><a href="#ai-assisted-development" class="table-of-contents__link toc-highlight">AI-Assisted Development</a></li></ul></li><li><a href="#-quick-start-for-contributors" class="table-of-contents__link toc-highlight">🚀 Quick Start for Contributors</a></li><li><a href="#-development-tools" class="table-of-contents__link toc-highlight">🛠️ Development Tools</a></li><li><a href="#-project-structure" class="table-of-contents__link toc-highlight">📦 Project Structure</a></li><li><a href="#-key-concepts" class="table-of-contents__link toc-highlight">🔍 Key Concepts</a></li><li><a href="#-testing" class="table-of-contents__link toc-highlight">🧪 Testing</a></li><li><a href="#-documentation-standards" class="table-of-contents__link toc-highlight">📝 Documentation Standards</a></li><li><a href="#-contributing" class="table-of-contents__link toc-highlight">🤝 Contributing</a></li><li><a href="#-license" class="table-of-contents__link toc-highlight">📄 License</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://jpawlowski.github.io/hass.tibber_prices/user/" target="_blank" rel="noopener noreferrer" class="footer__link-item">User Guide<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a class="footer__link-item" href="/hass.tibber_prices/developer/intro">Developer Guide</a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/jpawlowski/hass.tibber_prices/issues" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub Issues<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://community.home-assistant.io/" target="_blank" rel="noopener noreferrer" class="footer__link-item">Home Assistant Community<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div><div class="theme-layout-footer-column col footer__col"><div class="footer__title">More</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/jpawlowski/hass.tibber_prices" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li><li class="footer__item"><a href="https://github.com/jpawlowski/hass.tibber_prices/releases" target="_blank" rel="noopener noreferrer" class="footer__link-item">Release Notes<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">Not affiliated with Tibber AS. Community-maintained custom integration. Built with Docusaurus.</div></div></div></footer></div>
</body>
</html>