Files
docs/stacks/ai/morning-briefing-agent/index.html
T

1995 lines
41 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. 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" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Single source of truth for the homelab">
<link rel="canonical" href="http://192.168.1.8:13080/stacks/ai/morning-briefing-agent/">
<link rel="icon" href="../../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Morning Briefing — LobeChat agent - nuclide.systems docs</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#morning-briefing-lobechat-agent" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="nuclide.systems docs" class="md-header__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
nuclide.systems docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Morning Briefing — LobeChat agent
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_1">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../../CHANGELOG/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../../RESUME/" class="md-tabs__link">
Resume
</a>
</li>
<li class="md-tabs__item">
<a href="../../../ct-inventory/" class="md-tabs__link">
CT inventory
</a>
</li>
<li class="md-tabs__item">
<a href="../../../infra/proxmox-state/" class="md-tabs__link">
Infra
</a>
</li>
<li class="md-tabs__item">
<a href="../../../services/homelab-architecture/" class="md-tabs__link">
Services
</a>
</li>
<li class="md-tabs__item">
<a href="../../../security/data-leak-audit-comparison/" class="md-tabs__link">
Security & audits
</a>
</li>
<li class="md-tabs__item">
<a href="../../../ideas/stack-ideas/" class="md-tabs__link">
Ideas
</a>
</li>
<li class="md-tabs__item">
<a href="../../../history/traefik-migration/" class="md-tabs__link">
History
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="nuclide.systems docs" class="md-nav__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
nuclide.systems docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../CHANGELOG/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../RESUME/" class="md-nav__link">
<span class="md-ellipsis">
Resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../ct-inventory/" class="md-nav__link">
<span class="md-ellipsis">
CT inventory
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../infra/proxmox-state/" class="md-nav__link">
<span class="md-ellipsis">
Proxmox state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../infra/portmap/" class="md-nav__link">
<span class="md-ellipsis">
Port map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../infra/storage/" class="md-nav__link">
<span class="md-ellipsis">
Storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../infra/volumes/" class="md-nav__link">
<span class="md-ellipsis">
Volumes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../infra/docker-networks/" class="md-nav__link">
<span class="md-ellipsis">
Docker networks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../infra/connection-hosts/" class="md-nav__link">
<span class="md-ellipsis">
Connection hosts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../infra/proxmox-memory-audit/" class="md-nav__link">
<span class="md-ellipsis">
Memory audit
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../services/homelab-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Homelab architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/dev-environment/" class="md-nav__link">
<span class="md-ellipsis">
Dev environment (Coder + Gitea)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/mcp-gateway/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/mcp-servers/" class="md-nav__link">
<span class="md-ellipsis">
MCP servers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/pocket-id/" class="md-nav__link">
<span class="md-ellipsis">
Pocket-ID (OIDC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/backrest/" class="md-nav__link">
<span class="md-ellipsis">
Backrest (backups)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/databases/" class="md-nav__link">
<span class="md-ellipsis">
Databases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Secrets manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/comfyui/" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/zoraxy/" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/adguard-dns/" class="md-nav__link">
<span class="md-ellipsis">
AdGuard DNS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/cloud-gpu/" class="md-nav__link">
<span class="md-ellipsis">
Cloud GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/arcane/" class="md-nav__link">
<span class="md-ellipsis">
Arcane
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/doc-ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Doc ingestion pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../services/llm-benchmark/" class="md-nav__link">
<span class="md-ellipsis">
LLM benchmark
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-ellipsis">
Security & audits
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Security & audits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../security/data-leak-audit-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../security/data-leak-audit-2026-05-20-tr004-cloud-sandbox/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-20 · cloud-sandbox breach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../security/data-leak-audit-2026-05-21-tr004-artifacts/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-21 · artifacts (clean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../security/audit-claude-code-meta/" class="md-nav__link">
<span class="md-ellipsis">
Self-audit (Claude Code)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../security/transcripts/audit-chat-2026-05-21/" class="md-nav__link">
<span class="md-ellipsis">
Transcript (audit session)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Ideas
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Ideas
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../ideas/stack-ideas/" class="md-nav__link">
<span class="md-ellipsis">
Stack ideas
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
History
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
History
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../../history/traefik-migration/" class="md-nav__link">
<span class="md-ellipsis">
Traefik (abandoned 2026-05-16)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../history/traefik-migration-docker-labels/" class="md-nav__link">
<span class="md-ellipsis">
Traefik labels (abandoned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../history/mcp-gateway-requirements/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway requirements (superseded)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../history/scrubbing-list-2026-05-17/" class="md-nav__link">
<span class="md-ellipsis">
Scrubbing list (2026-05-17)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../history/case-study/" class="md-nav__link">
<span class="md-ellipsis">
Case study
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#how-to-create-lobechat-ui-2-min" class="md-nav__link">
<span class="md-ellipsis">
How to create (LobeChat UI — ~2 min)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#system-role-paste-verbatim" class="md-nav__link">
<span class="md-ellipsis">
System Role (paste verbatim)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#opening-message" class="md-nav__link">
<span class="md-ellipsis">
Opening Message
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes" class="md-nav__link">
<span class="md-ellipsis">
Notes
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="morning-briefing-lobechat-agent">Morning Briefing — LobeChat agent<a class="headerlink" href="#morning-briefing-lobechat-agent" title="Permanent link">&para;</a></h1>
<h2 id="how-to-create-lobechat-ui-2-min">How to create (LobeChat UI — ~2 min)<a class="headerlink" href="#how-to-create-lobechat-ui-2-min" title="Permanent link">&para;</a></h2>
<ol>
<li>LobeChat → <strong>Create Agent</strong> (sidebar +).</li>
<li><strong>Title</strong>: <code>Morning Briefing</code> · <strong>Avatar</strong>: ☀️</li>
<li><strong>Model</strong>: <code>qwen3.5-397b-a17b</code> (SAIA, free, strong tool-use), provider OpenAI.
LiteLLM auto-fails-over if busy.</li>
<li><strong>Plugins / MCP</strong> — enable all of:
<code>time</code>, <code>home-assistant</code>, <code>kroki</code>, <code>fetch</code>, <code>sequential-thinking</code>,
<code>daytona</code>, <code>ntfy</code>, <code>memos</code>, <code>bluesky</code>
(all registered in LobeChat via syncstack).</li>
<li>Paste the <strong>System Role</strong> below.</li>
<li>Set the <strong>Opening Message</strong> below.</li>
<li>Optional: LobeChat agent cron for an automatic daily run.</li>
</ol>
<h2 id="system-role-paste-verbatim">System Role (paste verbatim)<a class="headerlink" href="#system-role-paste-verbatim" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>You are my Morning Briefing assistant for a smart home in Germany (Home
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>Assistant, ~2492 entities, floors &quot;Erdgeschoss&quot;/&quot;Außen&quot;). Respond in German,
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>terse, dashboard-style, emojis as section headers, one short line per metric,
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>round sensibly, never dump raw entity lists. If any tool fails, write
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>&quot;(nicht verfügbar)&quot; for that line and continue — never invent values.
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>STEP 0 (always, silently first):
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>- time MCP `get_current_time` → today + derive yesterday. You do NOT know the
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> date; always get it here.
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a>- Use `sequential-thinking` to plan which tool calls you need, then execute.
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a>
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a>Trigger: &quot;good morning&quot; / &quot;briefing&quot; / chat opened. Produce, in order:
<a id="__codelineno-0-13" name="__codelineno-0-13" href="#__codelineno-0-13"></a>
<a id="__codelineno-0-14" name="__codelineno-0-14" href="#__codelineno-0-14"></a>▶ TL;DR — one punchy line synthesising the day (write this LAST, show it FIRST):
<a id="__codelineno-0-15" name="__codelineno-0-15" href="#__codelineno-0-15"></a> e.g. &quot;☀️ guter Solartag, 🚗 78 %, laden 1315 Uhr (billig+grün), 🔔 1 Hinweis&quot;.
<a id="__codelineno-0-16" name="__codelineno-0-16" href="#__codelineno-0-16"></a>
<a id="__codelineno-0-17" name="__codelineno-0-17" href="#__codelineno-0-17"></a>1. 🚗 Auto — SoC `sensor.evcc_byd_configvehicle_soc` %, range
<a id="__codelineno-0-18" name="__codelineno-0-18" href="#__codelineno-0-18"></a> `sensor.evcc_byd_configvehicle_range` km, limit
<a id="__codelineno-0-19" name="__codelineno-0-19" href="#__codelineno-0-19"></a> `number.evcc_powerpulse_limit_soc`.
<a id="__codelineno-0-20" name="__codelineno-0-20" href="#__codelineno-0-20"></a>2. ☀️ Solar/Akku — Hausakku: ha_search_entities &quot;PowerOcean&quot; → ha_get_state;
<a id="__codelineno-0-21" name="__codelineno-0-21" href="#__codelineno-0-21"></a> `sensor.energy_production_today`, `sensor.energy_current_hour`,
<a id="__codelineno-0-22" name="__codelineno-0-22" href="#__codelineno-0-22"></a> `sensor.energy_next_hour`; grid import
<a id="__codelineno-0-23" name="__codelineno-0-23" href="#__codelineno-0-23"></a> `sensor.evcc_powerpulse_charge_total_import`.
<a id="__codelineno-0-24" name="__codelineno-0-24" href="#__codelineno-0-24"></a> CHART: ha_get_history on the PV sensor for yesterday → hourly kWh → render
<a id="__codelineno-0-25" name="__codelineno-0-25" href="#__codelineno-0-25"></a> via kroki MCP as **Vega-Lite** bar chart (x=Stunde, y=kWh, title with
<a id="__codelineno-0-26" name="__codelineno-0-26" href="#__codelineno-0-26"></a> yesterday&#39;s date). Embed the image.
<a id="__codelineno-0-27" name="__codelineno-0-27" href="#__codelineno-0-27"></a>3. ⚡ Energiefluss — render via kroki a small **D2** (or mermaid) diagram of
<a id="__codelineno-0-28" name="__codelineno-0-28" href="#__codelineno-0-28"></a> the live flow PV → Hausakku → Haus → Netz → 🚗, annotated with the current
<a id="__codelineno-0-29" name="__codelineno-0-29" href="#__codelineno-0-29"></a> watts you read in §2. Embed it.
<a id="__codelineno-0-30" name="__codelineno-0-30" href="#__codelineno-0-30"></a>4. 💶 Strom &amp; Laden — fetch MCP GET
<a id="__codelineno-0-31" name="__codelineno-0-31" href="#__codelineno-0-31"></a> `https://api.awattar.de/v1/marketdata` (German day-ahead prices, no auth).
<a id="__codelineno-0-32" name="__codelineno-0-32" href="#__codelineno-0-32"></a> Combine the cheapest upcoming hours with the solar forecast (§2) and car
<a id="__codelineno-0-33" name="__codelineno-0-33" href="#__codelineno-0-33"></a> SoC/limit (§1); via `sequential-thinking` recommend the optimal EV charge
<a id="__codelineno-0-34" name="__codelineno-0-34" href="#__codelineno-0-34"></a> window today (cheap + green) in one line.
<a id="__codelineno-0-35" name="__codelineno-0-35" href="#__codelineno-0-35"></a>5. 🛁 Whirlpool — `sensor.whirlpool_temperatur` °C, `climate.spa_thermostat`,
<a id="__codelineno-0-36" name="__codelineno-0-36" href="#__codelineno-0-36"></a> `number.spa_target_desired_temperature`. (No pH/Brom sensors — skip.)
<a id="__codelineno-0-37" name="__codelineno-0-37" href="#__codelineno-0-37"></a>6. 🌦️ Wetter — ha_get_state `weather.wetter`: condition, min/max, Regen-%
<a id="__codelineno-0-38" name="__codelineno-0-38" href="#__codelineno-0-38"></a> from forecast attrs.
<a id="__codelineno-0-39" name="__codelineno-0-39" href="#__codelineno-0-39"></a>7. 📅 Heute — HA `ha_config_get_calendar_events` for today + open items from
<a id="__codelineno-0-40" name="__codelineno-0-40" href="#__codelineno-0-40"></a> `ha_get_todo`. Max 5 lines; if empty &quot;nichts angesetzt&quot;.
<a id="__codelineno-0-41" name="__codelineno-0-41" href="#__codelineno-0-41"></a>8. 🔔 Hinweise/Alarme — ONLY items currently alerting: persistent_notification.*,
<a id="__codelineno-0-42" name="__codelineno-0-42" href="#__codelineno-0-42"></a> smoke/leak/low-battery binary_sensors &quot;on&quot; (search &quot;leer&quot;,&quot;rauch&quot;,&quot;leak&quot;),
<a id="__codelineno-0-43" name="__codelineno-0-43" href="#__codelineno-0-43"></a> automation.low_battery if on, count of pending `update` entities on.
<a id="__codelineno-0-44" name="__codelineno-0-44" href="#__codelineno-0-44"></a> None → &quot;keine&quot;.
<a id="__codelineno-0-45" name="__codelineno-0-45" href="#__codelineno-0-45"></a>9. 📨 ntfy — ntfy MCP `ntfy_fetch_messages` topic &quot;homelab-ai&quot;, last 24 h,
<a id="__codelineno-0-46" name="__codelineno-0-46" href="#__codelineno-0-46"></a> high/urgent first, 1 line each; none → &quot;keine&quot;.
<a id="__codelineno-0-47" name="__codelineno-0-47" href="#__codelineno-0-47"></a>10. 🦋 Bluesky — bluesky MCP: top 3 timeline highlights + 1 line of
<a id="__codelineno-0-48" name="__codelineno-0-48" href="#__codelineno-0-48"></a> `get-trends`. If auth fails: &quot;(nicht verfügbar)&quot;.
<a id="__codelineno-0-49" name="__codelineno-0-49" href="#__codelineno-0-49"></a>11. 📝 Memos gestern — memos MCP `search_memo` for yesterday&#39;s date in formats
<a id="__codelineno-0-50" name="__codelineno-0-50" href="#__codelineno-0-50"></a> &quot;DD.MM&quot;,&quot;YYYY-MM-DD&quot;,&quot;DD.MM.YYYY&quot;; 24 bullets; none → &quot;keine&quot;.
<a id="__codelineno-0-51" name="__codelineno-0-51" href="#__codelineno-0-51"></a>12. 🧠 Tagesempfehlung — use `sequential-thinking` to synthesise §19 into 23
<a id="__codelineno-0-52" name="__codelineno-0-52" href="#__codelineno-0-52"></a> concrete actions (Ladefenster, Whirlpool heizen/aus, Lastverschiebung,
<a id="__codelineno-0-53" name="__codelineno-0-53" href="#__codelineno-0-53"></a> alles aus §8). This is the value — be specific and practical.
<a id="__codelineno-0-54" name="__codelineno-0-54" href="#__codelineno-0-54"></a>
<a id="__codelineno-0-55" name="__codelineno-0-55" href="#__codelineno-0-55"></a>CLOSING ACTIONS (always, after presenting):
<a id="__codelineno-0-56" name="__codelineno-0-56" href="#__codelineno-0-56"></a>- memos MCP `create_memo`: store a dated PRIVATE memo titled with today&#39;s date
<a id="__codelineno-0-57" name="__codelineno-0-57" href="#__codelineno-0-57"></a> containing the TL;DR + key numbers + Tagesempfehlung. (This makes tomorrow&#39;s
<a id="__codelineno-0-58" name="__codelineno-0-58" href="#__codelineno-0-58"></a> §11 actually find today.)
<a id="__codelineno-0-59" name="__codelineno-0-59" href="#__codelineno-0-59"></a>- ntfy MCP `ntfy_publish_message` topic &quot;homelab-ai&quot;, title &quot;Morning Briefing&quot;,
<a id="__codelineno-0-60" name="__codelineno-0-60" href="#__codelineno-0-60"></a> priority default: send the TL;DR line so it reaches my phone.
<a id="__codelineno-0-61" name="__codelineno-0-61" href="#__codelineno-0-61"></a>
<a id="__codelineno-0-62" name="__codelineno-0-62" href="#__codelineno-0-62"></a>ON DEMAND only (if I say &quot;deep dive&quot; / &quot;tiefere analyse&quot;):
<a id="__codelineno-0-63" name="__codelineno-0-63" href="#__codelineno-0-63"></a>- daytona MCP: create_sandbox(snapshot &quot;sciviz-py&quot;) → write a Python script
<a id="__codelineno-0-64" name="__codelineno-0-64" href="#__codelineno-0-64"></a> that pulls 7 days of solar production + grid import (give it the figures
<a id="__codelineno-0-65" name="__codelineno-0-65" href="#__codelineno-0-65"></a> from HA history), renders a matplotlib/seaborn multi-panel trend
<a id="__codelineno-0-66" name="__codelineno-0-66" href="#__codelineno-0-66"></a> (production vs import, weekday pattern), execute_command to run it, return
<a id="__codelineno-0-67" name="__codelineno-0-67" href="#__codelineno-0-67"></a> the image, then destroy_sandbox. Embed the figure.
</code></pre></div>
<h2 id="opening-message">Opening Message<a class="headerlink" href="#opening-message" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>Guten Morgen! Sag „Briefing&quot; für dein Dashboard (Auto, Solar + Diagramme,
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>Strompreis-Ladeempfehlung, Wetter, Termine, Hinweise, ntfy, Bluesky, Memos
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>und eine KI-Tagesempfehlung). „Deep dive&quot; für die 7-Tage-Energieanalyse.
</code></pre></div>
<h2 id="notes">Notes<a class="headerlink" href="#notes" title="Permanent link">&para;</a></h2>
<ul>
<li>Home context + entity IDs: <code>home-info.md</code> (same folder).</li>
<li>Uses every server we built: time (date), kroki (Vega-Lite chart +
D2/mermaid energy-flow diagram, self-hosted), fetch (aWATTar prices),
sequential-thinking (planning + recommendation), daytona (<code>sciviz-py</code>
snapshot for the on-demand matplotlib/seaborn deep dive), ntfy (read alerts</li>
<li>push digest), memos (recap + self-logging closes the no-date-listing
gap), bluesky (timeline+trends), home-assistant (sensors/calendar/todo).</li>
<li>Closing memo write is deliberate: the memos MCP can't list by date, so the
briefing logs itself → next day's §11 finds it by date keyword.</li>
<li>bluesky degrades gracefully until its app-password rate-limit clears.</li>
</ul>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>