Compare commits

...

159 Commits

Author SHA1 Message Date
claus 644cb28e88 Zigbee: opdater husplan med LQI-målinger 20/5 og nye enheder 2026-05-20 20:04:45 +02:00
claus 7cae5a8c8b Varme: gem defaults efter HA genstart 2026.5.1 2026-05-20 18:29:10 +02:00
claus 31c1258760 TODO: Gitea HTTPS via gitea.anneclaus.dk markeret løst 2026-05-20 17:34:42 +02:00
claus 7cb07af473 TODO: nas.anneclaus.dk via NPM markeret løst 2026-05-19 21:39:24 +02:00
claus 25ab4ceeef Stue lys: brug annes_favorit også i aften-perioden (efter 21:00) 2026-05-19 21:05:44 +02:00
claus ba3ba34db8 TODO: Plex markeret som skip 2026-05-19 21:00:18 +02:00
claus c54f583968 Varme: tilføj Bryggers og Køkken sektioner (uden climate-entiteter endnu) 2026-05-19 20:40:57 +02:00
claus 27224a4115 Madplan: opdater Mealie-links til https://mealie.anneclaus.dk 2026-05-18 18:22:03 +02:00
claus ff8324af1f TODO: Mealie HTTPS via NPM markeret løst 2026-05-18 18:19:38 +02:00
claus 6731257b83 Varme: tilføj havesensor inde til Kontor temperatur-graf 2026-05-18 07:29:03 +02:00
claus 8b533ca95a Dokumenter: tilføj zigbee husplan med enhedsplacering og LQI-data 2026-05-17 18:04:29 +02:00
claus b46d820c20 Madplan: tilføj store volumen op/ned knapper til Sonos Køkken 2026-05-17 17:45:26 +02:00
claus f5f085f155 Madplan: tilføj Claus Daily Mix 1-6 knapper - alle 4 familiers daily mix nu tilstede 2026-05-17 17:26:12 +02:00
claus 63b6283fdb Madplan: ret Sonos-kildenavne - Claus→Anne Daily Mix, fjern kommentarer 2026-05-17 17:23:49 +02:00
claus 9e446e0d57 Madplan: tilføj Sonos Køkken media-control + 22 kildeknapper (P3, Family Mix, Danske fav, Rock klassikere, Claus/Andreas/Daniel Daily Mix 1-6) 2026-05-17 17:21:07 +02:00
claus d0e3a6c3e5 Indkørsel: erstat Hue plug med Zigbee stik_indkorsel
- grupper.yaml: fjern light.indkorsel_plug fra Indkørsel og Udendørslamper grupper
- lysindkorsel.yaml: tilføj switch.stik_indkorsel turn_on/off ved alle 6 handlinger
- presence_simulation.yaml: tilføj switch.stik_indkorsel i morgen/aften sekvenser
- andreas_kommer_hjem: tilføj switch.stik_indkorsel turn_on/off
2026-05-17 11:14:38 +02:00
claus 8b2ff535de TODO: marker MQTT og FTP som lukket på router 2026-05-17 07:59:39 +02:00
claus acdc7259a7 TODO: tilføj MQTT og SSH til port forward sikringsliste 2026-05-17 07:57:31 +02:00
claus c297012592 TODO: tilføj opgaver for sikring af port forwards via NPM 2026-05-17 07:54:28 +02:00
claus 52dc97dd3d HA: external_url skiftet til ha.anneclaus.dk 2026-05-17 07:43:28 +02:00
claus 532f42b310 TODO: marker home_charging og Google AI MAX_TOKENS som løst 2026-05-16 20:04:26 +02:00
claus ad5bdf91b9 TODO: Husqvarna Automower BLE markeret løst 2026-05-16 20:02:23 +02:00
claus 0cb3145257 gitignore: ignorer www/snapshots - fjern fra tracking 2026-05-16 19:44:10 +02:00
claus 54144a03b8 TODO: markér aiohttp/400 løst — NPM HTTPS reverse proxy sat op 2026-05-16 19:42:57 +02:00
claus af3779a573 HA: HTTPS via NPM - opdater external_url og trusted_proxies 2026-05-16 18:05:10 +02:00
claus 3094620985 Nginx: porte ændret til 10080/10443 (8080/8443 optaget af Java/Synology) 2026-05-16 16:20:48 +02:00
claus 8057b3abf1 Nginx: use ports 8080/8443 to avoid conflict with Synology DSM on port 443 2026-05-16 16:12:22 +02:00
claus 677debfc27 Nginx: add nginx-proxy-manager service to docker-compose.infrastructure.yml 2026-05-16 16:08:12 +02:00
claus 910de6ed54 Varme: fix shell_command - run python3 directly inside container 2026-05-16 12:45:35 +02:00
claus bc6799c126 Varme: gem komforttemperaturer som defaults via knap på dashboard 2026-05-16 11:59:23 +02:00
claus 9f9de0524a Vanding: fix nedbørsprognose via trigger-template sensor (HA 2024.3+ forecast API) 2026-05-16 11:49:21 +02:00
claus eacd137a7c Gallery: add touch swipe support for iPhone/iPad 2026-05-16 10:37:10 +02:00
claus 63288dbb4b Gallery: add prune button (behold 100), webhook automation, shell_command 2026-05-16 10:35:28 +02:00
claus c394d6b974 Gallery: fix iframe cache-bust by versioning loader URL in dashboard YAML 2026-05-16 10:27:23 +02:00
claus fa64223630 Gallery: show all 192 snapshots (MAX 500), fix shell_command to use docker exec 2026-05-16 10:01:11 +02:00
claus f2ac6064b5 Dashboard views reorganized, mealie/roborock automations, indkorsel snapshots, wavin/sonoff docs, varme/sikkerhed updates 2026-05-16 07:28:28 +02:00
claus bd134bafef docs: tilføj vildtkamera (Reolink Argus 4 Pro + solpanel) på ønskeliste; script vi_laver_mad udvides med Daniel 2026-05-10 19:26:41 +02:00
claus 4e0819d4ff docs: udvid Aqara vindues/dørsensorer fra 6 til 15 stk (forgang, køkken, bryggers, stue, fordør, bagdør, kontor) 2026-05-10 17:48:05 +02:00
claus 0d112fb4d0 docs: tilføj automower BLE fejlfinding til kontekst 2026-05-10 16:16:19 +02:00
claus 067d5c6a63 Vi laver mad script+knap, Ally online, TODO/oensker opdateret, mealie/bilka sync 2026-05-09 06:19:50 +02:00
claus 5a7d25fd3c TODO: tilføj automower BLE auth fejl og AI MAX_TOKENS 2026-05-07 07:14:07 +02:00
claus bee2028f0b Julelys kun i vintersæson uge 42-8, tilføj TODO liste 2026-05-06 07:35:07 +02:00
claus 1525cc0070 Garageport: brug zigbee binary_sensor, animation baseret på last_changed 2026-05-05 19:43:51 +02:00
claus 812199889e Tilføj docker-compose, Touchline manual, netværksgenstart dok, fix ._* ignore 2026-05-05 19:40:05 +02:00
claus 7d5b31f9ab HA version bump, pløneklipper automation, robots scripts, bilka checklist opdatering, mealie 2026-05-05 19:38:12 +02:00
claus bf6f2feba6 Garageport animation, fjern alarm 1899, baghave lys vintersæson uge 42-8 2026-05-05 19:38:01 +02:00
claus ae8b1ea6f8 Opvaskemaskine: kvarter-påmindelser med actionable notification og vedligeholdscheck 2026-05-01 19:44:03 +02:00
claus 16b68da838 Home view: fjern vacation mode fra Modes-sektion (er nu i Ferie-sektionen) 2026-05-01 19:39:24 +02:00
claus 02d63e3d2b Godnat: brug individuelle pærer i stedet for light.sovevaerelse 2026-05-01 07:19:08 +02:00
claus 7b3bf5b375 Daniel motionlys toggle: ret til korrekt automation ID (daniel_lys_via_bevaegelse) 2026-05-01 07:13:33 +02:00
claus da78422f5e Syg: tilføj kommentar om at Andreas ikke har alarmer 2026-05-01 07:04:32 +02:00
claus ba0c34672c Ferie: sæt default start 13.7 kl 10 og slut 27.7 kl 12 2026-04-30 19:19:18 +02:00
claus 1805b4c107 Sonos ungroup: tilføj lille_badevaerelse ved 08:30 2026-04-30 19:00:54 +02:00
claus c366831dd0 Sonos gruppe: tilføj lille_badevaerelse 2026-04-30 18:59:56 +02:00
claus 6310ee4055 Mealie madplan: inkluder titel-entries uden opskrift (fx rester-noter) 2026-04-30 18:52:46 +02:00
claus 0e23bceb79 Ferie: tilføj vacation_start, auto-aktiver ved afrejse, vis start+slut på home view 2026-04-30 18:45:13 +02:00
claus 19dcab272e Badeværelse: Hue Tap Switch tilsidesætter bev.-automatik, 10 min timeout ved manuel tilstand 2026-04-30 06:36:12 +02:00
claus 1fdcf410ed Energi view: tilføj stik_sonos_stue, stik_quooker, stik_fryser, stik_bryggers 2026-04-29 21:19:12 +02:00
claus 83fc33f809 Energi view: tilføj Zigbee stik-sektion med effekt-graf, tile-kort og energistatistik 2026-04-29 21:17:03 +02:00
claus 1e96c41971 Sovevaerelse view: hold-slukning bruger light.sovevaerelse (alle 5 pærer) 2026-04-29 07:24:32 +02:00
claus 6c3def6996 Godnat: brug light.sovevaerelse (alle 5 pærer) i stedet for light.bedroom 2026-04-29 07:22:22 +02:00
claus 68db35cae3 Sovevaerelse: sluk-automation springer over mens godnat_sovevaerelse kører 2026-04-28 21:18:18 +02:00
claus 4e13ccf658 Input numbers: sync initial values to current HA state 2026-04-26 11:24:37 +02:00
claus 1063166faa Godnat: trin-for-trin daempning over 15 min (40->10->1->off) 2026-04-26 07:09:06 +02:00
claus 750dee2996 Sovevaerelse: godnat-knap daemper lys over 15 min (hold=sluk straks) 2026-04-25 19:40:26 +02:00
claus 7c6c62cff4 Fordorklokke: ret forgang lys (forgang_sensor/scene, ikke gang) 2026-04-25 19:35:31 +02:00
claus e0ec8391d9 Fordørklokke: tænd forgang lys ved ringning hvis mørkt 2026-04-25 19:33:40 +02:00
claus 6208f6fb49 Stue lys: moderniser til 1 automation (mode:restart), input_number parametre for lux+timeouts 2026-04-25 19:28:13 +02:00
claus 9cb7550f78 Motion-lys: input_number parametre for gang/daniel/kontor, fix badevaerelse timeout, kompakt lys view 2026-04-25 19:17:56 +02:00
claus 56f21f79e1 Docker: saml compose-filer i docker/ undermappe + tilføj unifi; monthly_scene: fjern light.syd 2026-04-25 17:49:57 +02:00
claus 6b302b7c65 Syg: fjern forældede alarm-IDs (445, 1874, 1894, 2273, 1899) 2026-04-25 13:45:41 +02:00
claus a7580b851a Dørklokke: gendan volumen på lille bad efter afspilning 2026-04-25 13:16:03 +02:00
claus 3d2cfe6437 Robots: manuelt start overrider family_presence stop for støvsuger og plæneklipper 2026-04-25 12:52:10 +02:00
claus 40cb13662a Varme: genberegn straks når komforttemperatur ændres 2026-04-25 12:43:54 +02:00
claus 9b833aef16 Vinduer: undgå flapping - kræv 5s stabil tilstand og ignorer unavailable 2026-04-25 07:07:19 +02:00
claus 4030b5995f Docker: tilføj /backups volume mount til homeassistant container 2026-04-24 19:49:30 +02:00
claus cd9bc28e9e Soft wakeup lys: spring over hvis anne eller claus er syg 2026-04-24 19:27:29 +02:00
claus c36e47d2ee Slet 02_person_status view (integreret i home view) 2026-04-24 19:16:10 +02:00
claus 94f0cd4d8a Home view: person-kort med fast billedstørrelse + lokation (Hjemme/Ude/zone) 2026-04-24 19:14:10 +02:00
claus 158beed9c5 Home view: person-billeder med syg-toggle (gråtoner + rød kant ved tryk) 2026-04-24 19:10:13 +02:00
claus 9c184ed0b7 Syg-status: ret 'Syg' → 'syg' (lowercase) i alle filer 2026-04-24 19:07:41 +02:00
claus df734d9259 Syg-status: sluk alarmer+motion lys, kompakt person view 2026-04-24 19:03:13 +02:00
claus 9f1dd20f06 Varme script: hvac off → set_temperature ferie_temp ved åbent vindue (Roth understøtter ikke off) 2026-04-24 17:44:01 +02:00
claus 8bd20bda42 Plæneklipper: opdater sidst klippet ved alle start-kilder (app, auto, HA) 2026-04-24 15:41:03 +02:00
claus 30fffd8651 Home view: plæneklipper datoformat + toggle-knapper til plæneklipper og støvsuger 2026-04-24 15:38:08 +02:00
claus 5a0232eeba Varme: vinduer trigger recalculate på åben+luk, script slukker aktivt ved åbent vindue 2026-04-24 15:32:17 +02:00
claus 3608da8a4c Wishlist: smartplugs + Danfoss stue indkøbt, badeværelse to be fixed 2026-04-24 07:09:28 +02:00
claus 7e38ef2e42 Varme view: gendan + tilføj datetime inputs og genberegn-knap 2026-04-24 07:04:37 +02:00
claus 72e0e583be Varme: gør morgen/aften-tider konfigurerbare via input_datetime
- Ny input_datetime/varme.yaml med varme_morgen_tid og varme_aften_tid
- Automations trigger nu på input_datetime-entiteterne i stedet for hardkodede tider
- Script beregner nat dynamisk ud fra de to tider (string-sammenligning)
- View: tilføj morgen/aften-tider til tabellen + manuel Genberegn-knap
2026-04-24 06:37:15 +02:00
claus 70d01bfabf Wishlist: specify Crucial CT4G4SFS8266 4GB SODIMM for DS920+ 2026-04-23 17:54:20 +02:00
claus 2ae9723fa3 Add window sensors to Ally rooms: badevarelse + stue 2026-04-23 17:48:01 +02:00
claus 9fbc1626d7 Add Danfoss Ally: stue + badevarelse to heating system and dashboard 2026-04-23 15:21:03 +02:00
claus cea0e599f9 Heating charts: add Roth current_temp + setpoint series, remove tile cards 2026-04-23 07:48:48 +02:00
claus b7caa8d158 Heating dashboard: tile cards, input_number sliders, vacation pre-heat 2 days before return 2026-04-23 07:42:14 +02:00
claus 542af023c8 Fix: set preset_mode none before temperature to clear Roth schedule (program_1 was overriding setpoints) 2026-04-23 07:07:29 +02:00
claus 9697dd2925 Heating tweaks: morning 06:00, comfort temps, valve scale 1-5, gauge card 2026-04-22 21:55:25 +02:00
claus fa79ffc0e6 Add automated Roth floor heating control: comfort temps, night/away/vacation setbacks, seasonal valve guidance 2026-04-22 21:43:49 +02:00
claus 5bbf0a5082 Fix 7-day meal plan table: use namespace to build rows, avoid YAML folded-scalar whitespace issue 2026-04-22 19:36:29 +02:00
claus 7b7dc22245 Simplify shopping list: drop Keep, fast reset, HTML output for HA iframe 2026-04-22 17:56:49 +02:00
claus 2c3e5bb540 Add HA YAML automation specialist agent 2026-04-22 16:54:50 +02:00
claus 0f3743c1cf Ignore tmp_backups directory 2026-04-22 16:42:10 +02:00
claus ea97b824e7 Import Valdemarsro favorites into Mealie via API 2026-04-22 16:34:43 +02:00
claus ef9200f65b Fix Mealie shopping refresh flow with bulk recipe import and Bilka outputs 2026-04-22 16:12:23 +02:00
claus 83f8908a3f Add Wednesday Bilka checklist merge flow and Madplan dashboard view 2026-04-22 07:37:37 +02:00
claus 98adadbaaa Update Madplan agent to always import recipes into Mealie 2026-04-22 07:24:52 +02:00
claus 8828281ae2 Fix dishwasher remote-control reminder OR logic and timestamp 2026-04-22 06:51:01 +02:00
claus dbf4b42738 Import all 38 Valdemarsro favorites into meal plan 2026-04-22 06:44:24 +02:00
claus 4b9202567d Update meal plan: Kylling med honning og sennep for today 2026-04-22 06:34:15 +02:00
claus 89dc2ec499 Add TODO list for Gitea external HTTPS setup 2026-04-22 06:30:35 +02:00
claus b13bc2e74b Add equipment overview and image prompt docs 2026-04-21 19:39:57 +02:00
claus d411488b27 Update Tesla deadline handling and meal plan 2026-04-21 19:38:19 +02:00
claus ab76023b12 Add infrastructure stack and planning updates 2026-04-21 19:31:56 +02:00
claus c82c8a66e5 Doerklokker: nattestop 22-06, logbook debug, batteri-overvågning
- bagdoer + fordoer: bloker lyd/notifikation kl 22-06
- logbook.log for ALLE MQTT events (ogsaa wake-ups) til debugging
- Ny sensor: shelly_bagdoer_batteri + shelly_fordoer_batteri (MQTT)
- Ny automation: notifikation ved under 30% batteri
2026-04-21 06:39:38 +02:00
claus 8fa3cf7c87 Oprydning light.gang: fjern duplikat, ret refs fra _2/_3
- gang.yaml: kommenteret ud (gruppen defineres i grupper.yaml med unique_id)
- lys_gang.yaml: light.gang_2 -> light.gang
- colorloopgang.yaml: light.gang_3 -> light.gang
- Entity registry: gang_2 renamed, gang_3 slettet
2026-04-20 16:16:56 +02:00
claus 6c26c6b05c Aktiver light.gang gruppe (var udkommenteret) 2026-04-20 16:02:21 +02:00
claus 6013bb6f81 Opvask påmindelse: tid 19-21, check dør lukket 2026-04-20 16:00:04 +02:00
claus f6a0c75dfb Ingen hjemme: kun indendoerslys, tilfoej kontor, notify sidste person
- Sluk kun light.indendorslamper (ikke udendoers)
- Tilfoej media_player.kontor til stop-liste
- Vindue-notifikation: send ogsaa til den der sidst forlod huset
2026-04-20 15:55:29 +02:00
claus 1cf12e53df Garage: fjern Tesla speed-krav fra leaving-trigger
Tesla-trackeren er for langsom til at vise speed naar telefon
forlader home. Brug i stedet garageport=on som bevis for bil-afrejse.
2026-04-20 15:48:27 +02:00
claus 43034bb41e Fix spontan doorbell efter HA genstart: restart-safe event_cnt
- input_number initial sat til -1 (sentinel for 'aldrig synkroniseret')
- condition fjernet, event_cnt check flyttet ind i action blok
- counter opdateres ALTID (ogsaa ved wake-up)
- doorbell koerer kun naar old_cnt >= 0 OG new_cnt != old_cnt
- foerste wake-up efter restart synkroniserer stille uden at ringe
2026-04-20 07:01:19 +02:00
claus ce888204db Fix Roborock wake timing, update kontekst.txt
- Roborock: wait for vacuum+battery != unknown/unavailable (2min timeout)
- Roborock: recompute variables AFTER wait_template, not at trigger time
- Roborock: block start if vacuum in error state (e.g. dock water refill)
- kontekst.txt: add device/integration details (TTS, garage, Roborock, Shelly, etc.)
2026-04-19 20:58:11 +02:00
claus 0311447d91 Robust garage: use input_boolean to track car departure
- Replace fragile Tesla tracker state check with input_boolean.left_home_by_car
- Set boolean ON when leaving by car (speed > 0), check it on arrival
- Add separate car_arriving trigger as backup for WiFi-first phone
- Fixes: garage not opening on arrival due to slow Tesla tracker updates
2026-04-19 19:25:20 +02:00
claus d39e0051db Fix TTS google_translate→google_ai_tts, robust garage automation
- Replace broken media_player.play_media/google_translate TTS with tts.speak/google_ai_tts
  in doerklokke_for.yaml (4x), doerklokke_bag2.yaml (3x), doorbell.yaml (1x)
- Garage automation: add GPS debounce, dual trigger (phone+car), cover.toggle,
  post-delay re-check, last_changed guard against false opens
- Remove duplicate doerklokke_bag.yaml (replaced by doerklokke_bag2.yaml)
2026-04-19 18:40:14 +02:00
claus fcb290a1aa Tilføj 'returning' state til støvsuger-check i derernogenihuset
Ignorerede allerede 'cleaning', men ikke 'returning' (på vej til dock).
2026-04-19 14:19:29 +02:00
claus ed6e91d52b Ignorer motion-notifikationer når støvsugeren kører
Tilføj condition til AI overvågning og 'der er nogen i indkørslen':
skip notifikation hvis vacuum.roborock_s8_pro_ultra er cleaning/returning
2026-04-19 14:18:27 +02:00
claus c7f6e74544 Tilføj 'Gå til dock' knap i støvsuger-sektionen på home view
Bruger vacuum.return_to_base til at sende Roborock S8 Pro Ultra hjem.
2026-04-19 14:14:59 +02:00
claus acb2540890 Fix ugens madplan: standalone button-card i stedet for entities-nested
- button-card som entity-row i entities-kort understøtter ikke custom_fields korrekt
- Bruger nu standalone custom:button-card direkte under cards
- Forenklet JS: var i stedet for const/let, \x27 i stedet for escaped quotes
- Undgår em-dash og andre special chars
2026-04-19 13:41:27 +02:00
claus 27228815ba Fix ugens madplan buttoncardjstemplateerror
- Skift YAML > (folded) til | (literal) - bevarer newlines korrekt
- Fjern nested template literals som button-card ikke kan parse
- Brug string concatenation i stedet for backtick templates
- Tilføj null-check for manglende entity data
- Fjern // kommentarer der kan foldes forkert
2026-04-19 13:31:43 +02:00
claus 6e9e28274c Mealie dashboard: brug anneclaus.dk:9925 i stedet for lokal IP
Links til opskrifter bruger nu eksternt domæne så de virker udefra.
2026-04-19 13:19:26 +02:00
claus be4f83fcb1 Fix Mealie madplan: REST response for stor (16KB+) til HA attributes
- Nyt Python-script henter fra Mealie API og gemmer forenklet JSON (754 bytes)
  til /config/www/mealie.json (kun dato, navn, slug per opskrift)
- REST sensor peger nu på lokal fil via http://localhost:8123/local/mealie.json
- shell_command + automation opdaterer filen hvert 30. minut og ved opstart
- Løser 'Ingen planlagt' og 'buttoncardtemplateerror' i dashboard
2026-04-19 13:14:02 +02:00
claus cd4da0eaed Fix Tesla start-ikon: mdi:flash-circle eksisterer ikke, bruger mdi:flash 2026-04-18 08:59:49 +02:00
claus aab1ead212 Fix mealie sensor: brug dict-key i stedet for attribut-access
value_json.items resolver til dict-metoden .items() når Mealie API
ikke er klar ved opstart. Bruger nu value_json['items'] med default.
2026-04-18 08:53:23 +02:00
claus 69942ef7b7 Tilføj HA long-lived access token til secrets.yaml 2026-04-18 08:48:31 +02:00
claus 654ae18ddd Tesla: manuel override for start/stop opladning
- input_boolean.tesla_manual_override: deaktiverer smart charging planlægning
- script.tesla_force_start_charging: sætter override + starter opladning
- script.tesla_force_stop_charging: sætter override + stopper opladning
- Smart charging automation springer over når override er aktiv
- Override nulstilles automatisk ved frakobling eller fuld opladning
- Tesla-view opdateret med nye knapper og override-toggle
2026-04-18 08:43:37 +02:00
claus 394fadd463 Fix vinduesautomationer og template-fejl
- Varme: brug wait_template i stedet for wait_for_trigger (template entity_id)
- Ventilation: brug condition template i stedet for condition state
- maintenance.yaml: fix manglende komma i batteri-liste
- vedligehold.yaml: fjern duplicate key 'name'
2026-04-18 08:19:30 +02:00
claus aa6413ea79 Aqara vinduesensorer: automationer, vedligehold og rum-views
- Varme slukker automatisk når vindue åbnes (andreas, daniel, soveværelse, lille bad)
- Notifikation ved åbent vindue når ingen er hjemme
- Notifikation når alle forlader huset med åbne vinduer
- Ventilation: påmindelse om udluftning ved høj CO2/fugt (kl 6-22)
- Påmindelse om at lukke vindue efter 15 min udluftning
- 6 vinduesensor-batterier tilføjet til vedligehold-view og maintenance template
- Vinduesensor tilføjet til andreas, daniel og soveværelse room views
2026-04-17 14:12:40 +02:00
claus 7f467714c3 Garage tile: dynamisk ikon via device_class garage_door
Fjernet hardcodet ikon. Entity registry sat til garage_door device_class
så HA viser mdi:garage-open (åben) og mdi:garage (lukket) automatisk.
2026-04-17 08:08:50 +02:00
claus ba49056764 Tilføj garageport sensor batteri til vedligehold-view 2026-04-17 08:04:18 +02:00
claus 66e28ce68f Tilføj plæneklipper error-status til vedligehold-view 2026-04-17 08:02:41 +02:00
claus 04c29a8839 Skift cover.open/close til cover.toggle med sensor-check
GoGoGate2 tror altid porten er lukket, så open/close virker ikke.
Bruger nu cover.toggle med binary_sensor.garageport check.
2026-04-17 07:58:01 +02:00
claus f8eacec2ff Erstat cover.anne sensor med binary_sensor.garageport (ThirdReality)
GoGoGate2 sensor er defekt - bruger nu ThirdReality garage door sensor
til state-tjek. GoGoGate2 bruges stadig til at åbne/lukke porten.
Entity registry opdateret med nye navne.
2026-04-17 07:49:23 +02:00
claus fd8ccb9771 Flyt madplan-tab hen efter Daniels værelse 2026-04-17 07:28:06 +02:00
claus 2c4f6c4308 Madplan dashboard view + Mealie sensorer + mad_announcement med dagens ret 2026-04-16 19:14:39 +02:00
claus 42930ef2f0 Tilføj notifikationer til plæneklipper automatiseringer 2026-04-16 17:18:45 +02:00
claus 999ffceec9 Tilføj plæneklipper automatiseringer og dashboard 2026-04-16 16:15:37 +02:00
claus 18d3293953 Fix gang sluk-automationer: brug light.gang gruppe i stedet for light.gang_2 + tilføj docker-compose.yml 2026-04-15 19:18:59 +02:00
claus 521b2c1bdd Add wake-up delay to Roborock automation - wait for battery sensor to respond before checking conditions 2026-04-13 15:36:31 +02:00
claus dab7471cdc Fix home announcements TTS service and lower temp volume 2026-04-13 07:09:38 +02:00
claus 611172805f Preserve and restore Sonos volume in home announcements 2026-04-13 07:06:09 +02:00
claus 36e26a577a Add away-mode automation to turn off lights and stop Sonos 2026-04-12 20:31:41 +02:00
claus ed9c97bdcf Add bedroom dashboard view with music, automations, and Netatmo climate 2026-04-12 14:23:38 +02:00
claus 406d05b6a9 Remove stale Sonos Tuesday alarm automations 2026-04-12 14:02:39 +02:00
claus ecaf672f05 Add Tesla maintenance section 2026-04-12 13:52:45 +02:00
claus df49d8814c Add Roborock start failure diagnostics 2026-04-11 15:47:50 +02:00
claus fe23f5cfe5 Add home dashboard action buttons for dinner and TV hygge 2026-04-10 15:22:11 +02:00
claus e446395b87 Improve Roborock last clean sensor refresh 2026-04-10 14:52:55 +02:00
claus db11e89b9a Skip house alert when Roborock is cleaning 2026-04-10 14:39:04 +02:00
claus cb3d6261c0 Add pro lighting view and fix Roborock battery sensor 2026-04-10 14:34:22 +02:00
claus 803fba79f7 Fix Tesla charge plan time window and dashboard entities 2026-04-09 19:05:09 +02:00
claus 7a61bb50d0 Fix Tesla dashboard entities and charging plan view 2026-04-09 18:59:23 +02:00
136 changed files with 10439 additions and 1944 deletions
+1 -1
View File
@@ -1 +1 @@
2026.4.1 2026.5.1
+57
View File
@@ -0,0 +1,57 @@
---
name: ha
description: "Use when creating, updating, or reviewing Home Assistant YAML automations, scripts, templates, dashboards, and includes in this repository. Trigger phrases: ha, home assistant, automation, script, yaml, lovelace, include, configuration.yaml."
tools: [read, edit, search, todo, execute]
user-invocable: true
---
You are a Home Assistant specialist for this exact repository.
Your primary goal is to produce reliable, maintainable YAML changes that match this installation's structure and conventions.
## Core Principles
- Target latest Home Assistant behavior and YAML syntax.
- Always prefer YAML-managed configuration over UI-generated storage unless explicitly requested.
- Keep changes minimal, safe, and consistent with nearby files.
- Never move secrets into tracked YAML files; keep secrets in secrets.yaml.
## Repository-Specific Layout
Follow these include rules from configuration.yaml:
- Automations: include/automations/ via include_dir_merge_list
- Scripts: include/scripts/ via include_dir_merge_named
- Shell commands: include/shell_commands/ via include_dir_merge_named
- Templates: include/templates/ via include_dir_merge_list
- Sensors: include/sensors/ via include_dir_merge_list
- Binary sensors: include/binary_sensors/ via include_dir_merge_list
- Inputs live under include/input/*/
When adding new logic:
- Put automations in include/automations/*.yaml (do not edit root automations.yaml unless asked).
- Put scripts in include/scripts/*.yaml (do not edit root scripts.yaml unless asked).
- Put shell commands in include/shell_commands/*.yaml.
- Keep Lovelace in YAML mode and edit existing YAML dashboards/views files.
## Automation Authoring Rules
- Use clear alias names and deterministic triggers.
- Prefer idempotent actions and guard conditions to avoid repeated/duplicate notifications.
- Use choose/conditions for branching instead of duplicated automations.
- Reuse existing helper entities and naming patterns where possible.
- Keep time/date logic explicit (timezone-aware assumptions for Europe/Copenhagen).
## YAML Quality Rules
- Preserve existing indentation and style in the target file.
- Avoid broad refactors when only a local change is needed.
- Keep comments short and only where they clarify non-obvious logic.
- If multiple files are touched, ensure references are consistent across automations/scripts/shell commands/dashboard buttons.
## Validation and Safety
- After edits, run a quick repository sanity check (at minimum inspect YAML structure and obvious syntax issues).
- If executable checks are available, run them and report results.
- Call out assumptions or runtime dependencies (custom components, integrations, mobile notify targets).
- Do not remove or overwrite unrelated user changes.
## Output Expectations
When asked to implement changes:
1. Make the YAML edits directly in the correct include files.
2. Explain exactly which files were changed and why.
3. Summarize any validation performed.
4. Mention any manual Home Assistant reload/restart steps required (automation/script reload vs full restart).
+61
View File
@@ -0,0 +1,61 @@
---
name: Madplan
description: "Use when creating or updating weekly dinner meal plans for this family, importing Valdemarsro recipes into Mealie, avoiding duplicates, and producing a Bilka ToGo shopping list. Trigger phrases: madplan, mealie, Valdemarsro, aftensmad, indkøbsliste, Bilka ToGo, ugeplan."
tools: [read, edit, search, web, todo, execute]
user-invocable: true
---
You are a specialist meal-planning agent for this Home Assistant + Mealie setup.
Your goal is to create practical weekly DINNER plans that match family nutrition needs, reuse leftovers smartly, and keep shopping simple.
## Family Profile
- Family of 4: Anne (49), Claus (54), Andreas (16), Daniel (14).
- Andreas: wants high protein and fewer carbs.
- Daniel: elite swimmer, trains 7x/week, needs high carbs.
- Anne and Claus: weight maintenance.
## Fixed Weekly Structure
- Dinner only.
- Sunday: cook double portion; serve leftovers Tuesday.
- Monday: cook double portion; serve leftovers Wednesday.
- Thursday: light, fast, flexible meal (family may eat at different times).
- Friday: "lækker mad" (for example ribeye-style dinner).
- Saturday: "lækker mad" (for example homemade salmon sushi).
## Recipe Source Rules
- Prefer Valdemarsro recipes.
- Always import planned recipes into Mealie by default.
- Fetch recipe pages and map to Mealie-friendly names/slugs before finalizing the plan.
- Never add duplicate recipes already present in Mealie or existing week plan.
- Keep the plan realistic for one weekly grocery run.
## Shopping Rules
- Build one combined weekly shopping list suitable for Bilka ToGo.
- Group clearly by category (produce, meat/fish, dairy, pantry, frozen, etc.).
- Use plain item names and practical quantities for 4 people, accounting for double-portion days.
- If exact quantities are unknown from source, provide best-effort estimates and mark them clearly.
## Workflow
1. Read current Mealie data and detect already planned dinners and existing imported recipes.
2. Propose or update a week plan that follows the fixed Sunday-Monday leftovers pattern.
3. Validate nutrition balance across the week:
- Ensure protein-forward options exist for Andreas.
- Ensure carb availability for Daniel (sides/add-ons where relevant).
- Keep Anne/Claus portions and sides weight-maintenance friendly.
4. Import all missing planned recipes into Mealie references before publishing the final plan.
5. Produce a Bilka ToGo shopping list for the final plan.
## Output Format
Always return:
1. Weekly dinner plan (Sun-Sat) with leftover links Tue/Wed.
2. Brief nutrition notes per day (protein/carbs adjustment hints per person).
3. "Imported to Mealie" section (added vs skipped as duplicate).
4. Bilka ToGo shopping list grouped by category.
5. Optional prep plan for Friday pickup/delivery and Sunday prep.
## Constraints
- Do not plan breakfast/lunch unless explicitly requested.
- Do not ignore the fixed leftovers pattern.
- Do not leave planned recipes unimported in Mealie unless blocked by missing source data.
- Do not include duplicate recipe imports.
- Keep recommendations practical for a busy training week.
+10
View File
@@ -1,5 +1,6 @@
# Ignore everything globally # Ignore everything globally
.DS_Store .DS_Store
._*
custom_components/ custom_components/
blueprints/ blueprints/
dwains-dashboard/ dwains-dashboard/
@@ -26,6 +27,7 @@ secrets.yaml
known_devices.yaml known_devices.yaml
configuration_full.yaml configuration_full.yaml
configuration_minimal.yaml configuration_minimal.yaml
.env.infrastructure
# --- Whitelist core files --- # --- Whitelist core files ---
!*.yaml !*.yaml
@@ -36,6 +38,10 @@ configuration_minimal.yaml
!.HA_VERSION !.HA_VERSION
!customize !customize
# --- Re-ignore macOS metadata files inside whitelisted dirs ---
include/**/.DS_Store
include/**/._*
# --- Whitelist directories --- # --- Whitelist directories ---
!www/ !www/
!include/ !include/
@@ -64,6 +70,7 @@ configuration_minimal.yaml
/oldscripts.yaml /oldscripts.yaml
# --- Local media snapshots and downloads --- # --- Local media snapshots and downloads ---
/www/snapshots/
/www/affalddk/ /www/affalddk/
/www/community/ /www/community/
/www/indkorsel_snapshot.jpg /www/indkorsel_snapshot.jpg
@@ -74,4 +81,7 @@ configuration_minimal.yaml
# --- Local helper scripts not used in git --- # --- Local helper scripts not used in git ---
/python_scripts/scene_generator.py /python_scripts/scene_generator.py
# --- Temporary backup workspace ---
/tmp_backups/
/python_scripts/update_climate.py /python_scripts/update_climate.py
+41 -1
View File
@@ -1,4 +1,3 @@
## Installation of home-assistant on Synology ## Installation of home-assistant on Synology
Follow https://www.home-assistant.io/installation/alternative/: Follow https://www.home-assistant.io/installation/alternative/:
@@ -86,6 +85,47 @@ Synology.
https://thomes.blog/2020/12/09/how-to-gitea-on-synology/ https://thomes.blog/2020/12/09/how-to-gitea-on-synology/
## Synology infrastructure stack
Hvis Synology genstarter, er det let at ende med at Mosquitto, Gitea DB og Gitea ikke kommer op i korrekt rækkefølge.
Denne repo indeholder derfor også en compose-baseret variant i [docker-compose.infrastructure.yml](docker-compose.infrastructure.yml) med:
* `restart: unless-stopped` på Mosquitto, Gitea DB og Gitea
* healthchecks på alle tre services
* `depends_on` så Gitea først starter når databasen er healthy
* Gitea-vaerdier justeret til at spejle den nuvaerende interne `app.ini`-opsaetning
Brug den sammen med en lokal `.env.infrastructure` baseret på [.env.infrastructure.example](.env.infrastructure.example).
Det giver en mere robust opstart end manuelt oprettede containere i Synology UI, især efter NAS-reboot.
### Sikker migration fra Synology UI til compose
Hvis du vil flytte Mosquitto, Gitea DB og Gitea fra Synology UI til compose uden datatab, saa goer det i denne raekkefoelge:
1. Bekraeft at paths i `.env.infrastructure` matcher de eksisterende mounts i Synology UI.
2. Tag backup af mindst disse mapper: `/volume1/docker/gitea/data`, `/volume1/docker/gitea/db` og Mosquitto `config`, `data`, `log`.
3. Eksporter eller tag screenshots af nuvaerende container-indstillinger i Synology UI, saa porte, mounts og miljoevariabler kan sammenlignes bagefter.
4. Stop foerst `gitea`, derefter `gitea-db` og til sidst `mosquitto` i Synology UI.
5. Lad containerne blive liggende i UI i foerste omgang, men undgaa at starte dem igen under testen.
6. Kør compose-stakken med samme data-mounts, saa de nye containere genbruger eksisterende data i stedet for at initialisere nyt dataindhold.
7. Start foerst `gitea-db` og vent til den er healthy.
8. Start derefter `gitea` og kontroller at login, repositories og push virker som foer.
9. Start `mosquitto` og kontroller at Home Assistant reconnecter, og at dørklokker eller andre MQTT-afhaengige funktioner virker igen.
10. Naar alt virker stabilt, kan de gamle UI-oprettede containere slettes eller deaktiveres permanent.
Praktisk testsekvens efter migration:
* Aabn Gitea og bekraeft at repos og historik er intakte.
* Test et `git pull` og et lille `git push` mod Gitea.
* Bekraeft at Home Assistant kan ramme MQTT igen.
* Ring paa en doerklokke eller test en anden MQTT-trigger.
Vigtig regel: genbrug eksisterende data-paths under hele migrationen. Den stoerste risiko er ikke compose-filen, men at man ved en fejl starter en ny tom database eller en ny tom Gitea-data-mappe.
En kort cutover-version findes i [dokumenter/infrastructure_cutover_checklist.md](dokumenter/infrastructure_cutover_checklist.md).
## use git version control on the local gitea client ## use git version control on the local gitea client
https://community.home-assistant.io/t/sharing-your-configuration-on-github/195144 https://community.home-assistant.io/t/sharing-your-configuration-on-github/195144
+5 -1
View File
@@ -6,7 +6,7 @@ default_config:
homeassistant: homeassistant:
name: !secret name name: !secret name
external_url: "http://anneclaus.duckdns.org:8123" external_url: "https://ha.anneclaus.dk"
internal_url: "http://dethlefsen:8123" internal_url: "http://dethlefsen:8123"
auth_providers: auth_providers:
- type: homeassistant - type: homeassistant
@@ -27,6 +27,7 @@ http:
trusted_proxies: trusted_proxies:
- 127.0.0.1 - 127.0.0.1
- 10.0.0.142 - 10.0.0.142
- 172.17.0.0/16 # Docker bridge (NPM)
logger: logger:
default: warning default: warning
@@ -38,6 +39,7 @@ logger:
homeassistant.components.discovery: error homeassistant.components.discovery: error
homeassistant.components.dlna_dmr: error homeassistant.components.dlna_dmr: error
async_upnp_client: error async_upnp_client: error
automower_ble: critical
recorder: recorder:
purge_keep_days: 7 purge_keep_days: 7
@@ -139,6 +141,8 @@ lovelace:
type: module type: module
- url: /local/community/apexcharts-card/apexcharts-card.js - url: /local/community/apexcharts-card/apexcharts-card.js
type: module type: module
- url: /local/community/lovelace-mushroom/mushroom.js
type: module
dashboards: dashboards:
lovelace: lovelace:
mode: yaml mode: yaml
+76 -3
View File
@@ -155,6 +155,58 @@ cards:
target: target:
entity_id: button.roborock_s8_pro_ultra_vac_followed_by_mop entity_id: button.roborock_s8_pro_ultra_vac_followed_by_mop
- type: button
name: Gå til dock
icon: mdi:home-import-outline
tap_action:
action: call-service
service: vacuum.return_to_base
target:
entity_id: vacuum.roborock_s8_pro_ultra
# 🏎️ Plæneklipper
- type: horizontal-stack
cards:
- type: custom:button-card
entity: input_datetime.ploeneklipper_sidst_koert
show_icon: false
show_name: true
show_state: true
name: Sidst klippet
tap_action:
action: none
styles:
card:
- padding: 8px
name:
- font-size: 11px
- color: var(--secondary-text-color)
- padding-bottom: 4px
state:
- white-space: normal
- word-break: break-word
- line-height: 1.2
- font-size: 13px
- text-align: center
- type: button
name: Klip
icon: mdi:robot-mower
tap_action:
action: call-service
service: lawn_mower.start_mowing
target:
entity_id: lawn_mower.husqvarna_automower
- type: button
name: Stop
icon: mdi:home-import-outline
tap_action:
action: call-service
service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
# 💡 Lys kontrol # 💡 Lys kontrol
- type: horizontal-stack - type: horizontal-stack
cards: cards:
@@ -179,13 +231,15 @@ cards:
show_state: true show_state: true
- type: tile - type: tile
entity: cover.anne entity: binary_sensor.garageport
name: Garage name: Garage
icon: mdi:garage
features_position: bottom features_position: bottom
vertical: false vertical: false
tap_action: tap_action:
action: toggle action: call-service
service: cover.toggle
target:
entity_id: cover.anne
show_state: true show_state: true
# 🎵 Sonos # 🎵 Sonos
@@ -313,6 +367,25 @@ cards:
action: call-service action: call-service
service: script.receiver_volume_down_5 service: script.receiver_volume_down_5
# 🍽️ Hjemmeknapper
- type: grid
columns: 2
square: false
cards:
- type: button
name: Der er mad
icon: mdi:silverware-fork-knife
tap_action:
action: call-service
service: script.mad_announcement
- type: button
name: TV hygge
icon: mdi:television-ambient-light
tap_action:
action: call-service
service: script.tv_hygge_announcement
# 🗑️ Affald # 🗑️ Affald
- type: glance - type: glance
columns: 3 columns: 3
-79
View File
@@ -1,79 +0,0 @@
title: Person Status
path: person-status
icon: mdi:account-group
type: sections
max_columns: 1 # én kolonne for fuld bredde
sections:
# 👨‍👩‍👧‍👦 Personer (2x2 grid)
- type: grid
columns: 2
square: false
cards:
- type: entities
title: Daniel
entities:
- entity: person.daniel_schusler_dethlefsen
- entity: input_select.daniel_status
- type: entities
title: Claus
entities:
- entity: person.claus_dethlefsen
- entity: input_select.claus_status
- type: entities
title: Anne
entities:
- entity: person.anne_schusler_dethlefsen
- entity: input_select.anne_status
- type: entities
title: Andreas
entities:
- entity: person.andreas_schusler_dethlefsen
- entity: input_select.andreas_status
# 🗺️ Popup kort nederst
- type: grid
cards:
- type: custom:button-card
name: Åbn kort
icon: mdi:map
show_state: false
styles:
card:
- border-radius: 16px
- padding: 14px
- background: linear-gradient(135deg, rgba(0,0,0,0.05), rgba(0,0,0,0.1))
icon:
- color: var(--primary-color)
name:
- font-size: 14px
- font-weight: 600
tap_action:
action: call-service
service: browser_mod.popup
service_data:
title: 📍 Familien
size: fullscreen
style:
--popup-border-radius: 20px
--popup-background-color: rgba(0,0,0,0.9)
content:
type: map
default_zoom: 12
hours_to_show: 6
aspect_ratio: 1
entities:
- entity: device_tracker.andreas_iphone_12
name: Andreas
- entity: device_tracker.daniels_iphone_7_3
name: Daniel
- entity: device_tracker.annes_iphone_xs_4
name: Anne
- entity: device_tracker.claus_iphone_15pro
name: Claus
+9
View File
@@ -272,6 +272,15 @@ sections:
entity: sensor.sovevaerelse_stue_carbon_dioxide entity: sensor.sovevaerelse_stue_carbon_dioxide
name: CO₂ name: CO₂
- type: grid
cards:
- type: heading
heading: Vindue
- type: tile
entity: binary_sensor.andreas_vindue
name: Vindue
- type: grid - type: grid
cards: cards:
- type: heading - type: heading
+9
View File
@@ -272,6 +272,15 @@ sections:
entity: sensor.sovevaerelse_daniel_carbon_dioxide entity: sensor.sovevaerelse_daniel_carbon_dioxide
name: CO₂ name: CO₂
- type: grid
cards:
- type: heading
heading: Vindue
- type: tile
entity: binary_sensor.daniel_vindue
name: Vindue
- type: grid - type: grid
cards: cards:
- type: heading - type: heading
+177
View File
@@ -0,0 +1,177 @@
title: Sovevaerelse
path: sovevaerelse
icon: mdi:bed-king-outline
type: sections
sections:
- type: grid
cards:
- type: custom:button-card
name: Godnat
icon: mdi:weather-night
tap_action:
action: call-service
service: script.godnat_sovevaerelse
hold_action:
action: call-service
service: light.turn_off
service_data:
entity_id: light.sovevaerelse
styles:
card:
- height: 64px
- background-color: "#1a1a2e"
- color: "#c8b8f0"
icon:
- color: "#c8b8f0"
- width: 24px
name:
- font-size: 14px
- color: "#c8b8f0"
- type: grid
cards:
- type: heading
heading: Musik
- type: media-control
entity: media_player.sovevaerelse
name: Sonos Sovevaerelse
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
name: DR P3
icon: mdi:radio
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.sovevaerelse
data:
source: "0 DR P3"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Family Mix
icon: mdi:account-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.sovevaerelse
data:
source: "1 Family Mix"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: grid
cards:
- type: heading
heading: Lysautomatik
- type: tile
entity: automation.lys_sovevaerelse_dag_arbejdsdag
name: Dag (arbejdsdag)
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_dag_ikke_arbejdsdag
name: Dag (ikke arbejdsdag)
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_aften
name: Aften
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_godnat
name: Godnat 1
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_godnat_2
name: Godnat 2
tap_action:
action: toggle
- type: tile
entity: automation.lys_sovevaerelse_godnat_3
name: Godnat 3
tap_action:
action: toggle
- type: tile
entity: automation.sluk_lys_i_sovevaerelse
name: Sluk uden bevaegelse
tap_action:
action: toggle
- type: grid
cards:
- type: heading
heading: Alarm og Wakeup
- type: tile
entity: automation.turn_on_alarms_soft_wakeup
name: Soft wakeup automatik
tap_action:
action: toggle
- type: tile
entity: automation.turn_on_alarms_andreas
name: Alarm automatik (hverdage)
tap_action:
action: toggle
- type: tile
entity: automation.turn_on_alarms_andreas_saturdays
name: Alarm automatik (loerdag)
tap_action:
action: toggle
- type: grid
cards:
- type: heading
heading: Klima (Netatmo)
- type: tile
entity: sensor.sovevaerelse_temperatur
name: Temperatur
- type: tile
entity: sensor.sovevaerelse_luftfugtighed
name: Luftfugtighed
- type: tile
entity: sensor.sovevaerelse_carbon_dioxide
name: CO2
- type: grid
cards:
- type: heading
heading: Vindue
- type: tile
entity: binary_sensor.sovevaerelse_vindue
name: Vindue
+696
View File
@@ -0,0 +1,696 @@
title: Madplan
path: madplan
icon: mdi:chef-hat
cards:
# 🍽️ Dagens ret - stort fremhævet kort med link til Mealie
- type: custom:button-card
entity: sensor.dagens_aftensmad
show_icon: true
show_name: true
show_state: true
icon: mdi:food-variant
name: I dag
tap_action:
action: url
url_path: >
[[[
var slug = states['sensor.dagens_aftensmad_slug'].state;
if (slug && slug !== '' && slug !== 'unknown') {
return 'https://mealie.anneclaus.dk/g/home/r/' + slug;
}
return 'https://mealie.anneclaus.dk';
]]]
styles:
card:
- padding: 16px
- background: var(--primary-color)
- border-radius: 12px
icon:
- color: white
- width: 40px
name:
- font-size: 13px
- color: "rgba(255,255,255,0.7)"
- text-transform: uppercase
- letter-spacing: 1px
state:
- font-size: 22px
- font-weight: bold
- color: white
- padding-top: 4px
# 🎵 Musik i køkken + Vi laver mad + Der er mad
- type: grid
columns: 2
square: false
cards:
- type: button
name: Musik i køkken
icon: mdi:music-note-outline
tap_action:
action: call-service
service: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "1 Family Mix"
- type: button
name: Vi laver mad
icon: mdi:chef-hat
tap_action:
action: call-service
service: script.vi_laver_mad
- type: button
name: Der er mad!
icon: mdi:silverware-fork-knife
tap_action:
action: call-service
service: script.mad_announcement
# 📅 Madplan: i dag + 6 dage
- type: markdown
content: |-
{%- set ns = namespace(rows="") -%}
{%- set items = state_attr('sensor.mealie_madplan_ugen', 'items') or [] -%}
{%- set days = ['Mandag','Tirsdag','Onsdag','Torsdag','Fredag','Lørdag','Søndag'] -%}
{%- for offset in range(7) -%}
{%- set day = now().date() + timedelta(days=offset) -%}
{%- set ms = items | selectattr('date', 'eq', day.isoformat()) | list -%}
{%- set m = ms[0] if ms else none -%}
{%- set recipe = m.recipe if m else none -%}
{%- set name = recipe.name if recipe else '' -%}
{%- set slug = recipe.slug if recipe else '' -%}
{%- set label = 'I dag' if offset == 0 else days[day.weekday()] -%}
{%- if slug -%}
{%- set ns.rows = ns.rows + "| **" + label + "** | [" + name + "](https://mealie.anneclaus.dk/g/home/r/" + slug + ") |\n" -%}
{%- elif name -%}
{%- set ns.rows = ns.rows + "| **" + label + "** | " + name + " |\n" -%}
{%- else -%}
{%- set ns.rows = ns.rows + "| **" + label + "** | - |\n" -%}
{%- endif -%}
{%- endfor -%}
## Næste 7 dage
| Dag | Ret |
| --- | --- |
{{ ns.rows }}
# 🎵 Sonos Køkken
- type: media-control
entity: media_player.kokken
name: Sonos Køkken
- type: grid
columns: 2
square: false
cards:
- type: custom:button-card
name: Volumen ned
icon: mdi:volume-minus
tap_action:
action: perform-action
perform_action: media_player.volume_down
target:
entity_id: media_player.kokken
hold_action:
action: perform-action
perform_action: media_player.volume_down
target:
entity_id: media_player.kokken
styles:
card:
- height: 72px
- font-size: 16px
- background: var(--primary-color)
icon:
- color: white
- width: 36px
name:
- color: white
- font-size: 13px
- type: custom:button-card
name: Volumen op
icon: mdi:volume-plus
tap_action:
action: perform-action
perform_action: media_player.volume_up
target:
entity_id: media_player.kokken
hold_action:
action: perform-action
perform_action: media_player.volume_up
target:
entity_id: media_player.kokken
styles:
card:
- height: 72px
- font-size: 16px
- background: var(--primary-color)
icon:
- color: white
- width: 36px
name:
- color: white
- font-size: 13px
- type: grid
columns: 3
square: false
cards:
- type: custom:button-card
name: DR P3
icon: mdi:radio
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "0 DR P3"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Family Mix
icon: mdi:account-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "1 Family Mix"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Danske fav.
icon: mdi:music-note
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Danske favoritter"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Rock klassikere
icon: mdi:music-note-outline
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Danske rock klassikere"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Anne Mix 1
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Anne Daily Mix 1"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Anne Mix 2
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Anne Daily Mix 2"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Anne Mix 3
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Anne Daily Mix 3"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Anne Mix 4
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Anne Daily Mix 4"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Anne Mix 5
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Anne Daily Mix 5"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Anne Mix 6
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Anne Daily Mix 6"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Claus Mix 1
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Claus Daily Mix 1"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Claus Mix 2
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Claus Daily Mix 2"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Claus Mix 3
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Claus Daily Mix 3"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Claus Mix 4
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Claus Daily Mix 4"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Claus Mix 5
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Claus Daily Mix 5"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Claus Mix 6
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Claus Daily Mix 6"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Andreas Mix 1
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 1"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Andreas Mix 2
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 2"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Andreas Mix 3
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 3"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Andreas Mix 4
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 4"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Andreas Mix 5
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 5"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Andreas Mix 6
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Andreas Daily Mix 6"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Daniel Mix 1
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Daniel Daily Mix 1"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Daniel Mix 2
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Daniel Daily Mix 2"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Daniel Mix 3
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Daniel Daily Mix 3"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Daniel Mix 4
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Daniel Daily Mix 4"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Daniel Mix 5
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Daniel Daily Mix 5"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
- type: custom:button-card
name: Daniel Mix 6
icon: mdi:playlist-music
tap_action:
action: perform-action
perform_action: media_player.select_source
target:
entity_id: media_player.kokken
data:
source: "Daniel Daily Mix 6"
styles:
card:
- height: 52px
- padding: 6px 8px
icon:
- width: 18px
name:
- font-size: 11px
+215
View File
@@ -0,0 +1,215 @@
title: Vanding
path: vanding
icon: mdi:sprinkler-variant
type: sections
max_columns: 2
sections:
# 💧 Jordfugt målere
- type: grid
cards:
- type: heading
heading: Jordfugt
icon: mdi:water-percent
- type: gauge
entity: sensor.annes_havesensor_soil_moisture_1
name: Højbed 1 Ærter
min: 0
max: 100
needle: true
severity:
green: 40
yellow: 20
red: 0
- type: gauge
entity: sensor.annes_havesensor_soil_moisture_2
name: Højbed 2 Kartofler
min: 0
max: 100
needle: true
severity:
green: 40
yellow: 20
red: 0
- type: gauge
entity: sensor.annes_havesensor_soil_moisture_3
name: Højbed 3 Rabarber
min: 0
max: 100
needle: true
severity:
green: 40
yellow: 20
red: 0
- type: gauge
entity: sensor.annes_havesensor_soil_moisture_4
name: Drivhus
min: 0
max: 100
needle: true
severity:
green: 45
yellow: 25
red: 0
# 📈 Jordfugt historik
- type: grid
cards:
- type: heading
heading: Jordfugt 7 dage
icon: mdi:chart-line
- type: history-graph
title: Højbede (%)
entities:
- entity: sensor.annes_havesensor_soil_moisture_1
name: HB1 Ærter
- entity: sensor.annes_havesensor_soil_moisture_2
name: HB2 Kartofler
- entity: sensor.annes_havesensor_soil_moisture_3
name: HB3 Rabarber
hours_to_show: 168
refresh_interval: 900
- type: history-graph
title: Drivhus (%)
entities:
- entity: sensor.annes_havesensor_soil_moisture_4
name: Drivhus
hours_to_show: 168
refresh_interval: 900
# 🌧️ Regn & vejr
- type: grid
cards:
- type: heading
heading: Regn (Netatmo)
icon: mdi:weather-rainy
- type: tile
entity: sensor.n22_nedbor
name: Nedbør nu
- type: tile
entity: sensor.n22_precipitation_today
name: Nedbør i dag
- type: history-graph
title: Nedbør 7 dage
entities:
- entity: sensor.n22_precipitation_today
name: Nedbør
hours_to_show: 168
refresh_interval: 1800
- type: custom:apexcharts-card
header:
show: true
title: Forventet nedbør næste 7 dage
graph_span: 7d
span:
start: day
apex_config:
chart:
type: bar
height: 200
dataLabels:
enabled: true
formatter: |
EVAL:function(val) { return val ? val + ' mm' : ''; }
xaxis:
type: datetime
labels:
datetimeFormatter:
day: "dd/MM"
yaxis:
min: 0
title:
text: mm
series:
- entity: sensor.vejr_daglig_prognose
name: Nedbør
color: "#4fc3f7"
data_generator: |
return entity.attributes.forecast.map(f => ({
x: new Date(f.datetime).getTime(),
y: f.precipitation ?? 0
}));
# ⏸️ Rain Bird RC2
- type: grid
cards:
- type: heading
heading: Rain Bird RC2
icon: mdi:sprinkler-fire
- type: tile
entity: sensor.annes_vanding_raindelay
name: Regn-forsinkelse status
- type: tile
entity: number.annes_vanding_rain_delay
name: Sæt forsinkelse (dage)
- type: tile
entity: calendar.annes_vanding
name: Vandingsplan
# 🌿 Zonekontrol
- type: grid
cards:
- type: heading
heading: Zoner manuel styring
icon: mdi:water-pump
- type: tile
entity: switch.hojbed_1
name: Højbed 1 Ærter
icon: mdi:sprinkler
- type: tile
entity: switch.hojbed_2
name: Højbed 2 Kartofler
icon: mdi:sprinkler
- type: tile
entity: switch.hojbed_3
name: Højbed 3 Rabarber
icon: mdi:sprinkler
- type: tile
entity: switch.drivhus_drypvanding
name: Drivhus
icon: mdi:greenhouse
# 🔋 Sensorbatterier
- type: grid
cards:
- type: heading
heading: Sensor batterier
icon: mdi:battery
- type: glance
show_name: true
show_icon: true
show_state: true
columns: 4
entities:
- entity: sensor.annes_havesensor_soil_battery_1
name: HB1
icon: mdi:battery
- entity: sensor.annes_havesensor_soil_battery_2
name: HB2
icon: mdi:battery
- entity: sensor.annes_havesensor_soil_battery_3
name: HB3
icon: mdi:battery
- entity: sensor.annes_havesensor_soil_battery_4
name: Drivhus
icon: mdi:battery
+261 -28
View File
@@ -37,10 +37,15 @@ sections:
name: Netatmo name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature_2 - entity: sensor.hue_motion_sensor_2_temperature_2
name: Hue name: Hue
- entity: climate.andreas
- type: thermostat attribute: current_temperature
entity: climate.andreas name: Roth aktuelt
name: Andreas - entity: climate.andreas
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -72,10 +77,15 @@ sections:
name: Netatmo name: Netatmo
- entity: sensor.hue_motion_sensor_2_temperature - entity: sensor.hue_motion_sensor_2_temperature
name: Hue name: Hue
- entity: climate.daniel
- type: thermostat attribute: current_temperature
entity: climate.daniel name: Roth aktuelt
name: Daniel - entity: climate.daniel
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -111,10 +121,15 @@ sections:
name: Skab Claus name: Skab Claus
- entity: sensor.temperature - entity: sensor.temperature
name: Skab Anne name: Skab Anne
- entity: climate.sovev_prelse
- type: thermostat attribute: current_temperature
entity: climate.sovev_prelse name: Roth aktuelt
name: Sovevaerelse - entity: climate.sovev_prelse
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -144,10 +159,17 @@ sections:
series: series:
- entity: sensor.kontor_motion_temperatur - entity: sensor.kontor_motion_temperatur
name: Hue name: Hue
- entity: sensor.annes_havesensor_indoor_temperature
- type: thermostat name: Havesensor inde
entity: climate.kontor - entity: climate.kontor
name: Kontor attribute: current_temperature
name: Roth aktuelt
- entity: climate.kontor
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -177,10 +199,15 @@ sections:
series: series:
- entity: sensor.gang_sensor_temperature - entity: sensor.gang_sensor_temperature
name: Hue name: Hue
- entity: climate.fordelingsgang
- type: thermostat attribute: current_temperature
entity: climate.fordelingsgang name: Roth aktuelt
name: Gang - entity: climate.fordelingsgang
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -188,7 +215,7 @@ sections:
graph_span: 24h graph_span: 24h
header: header:
show: true show: true
title: Bad title: Badeværelse
show_states: true show_states: true
colorize_states: true colorize_states: true
now: now:
@@ -210,6 +237,15 @@ sections:
series: series:
- entity: sensor.bad_motion_sensor_temperature - entity: sensor.bad_motion_sensor_temperature
name: Hue name: Hue
- entity: climate.badevarelse
attribute: current_temperature
name: Ally aktuelt
- entity: climate.badevarelse
attribute: temperature
name: Ally mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -239,6 +275,15 @@ sections:
series: series:
- entity: sensor.stue_motion_temperatur - entity: sensor.stue_motion_temperatur
name: Hue name: Hue
- entity: climate.stue
attribute: current_temperature
name: Ally aktuelt
- entity: climate.stue
attribute: temperature
name: Ally mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
@@ -268,13 +313,201 @@ sections:
series: series:
- entity: sensor.forgang_sensor_temperature - entity: sensor.forgang_sensor_temperature
name: Hue name: Hue
- entity: climate.forgang
- type: thermostat attribute: current_temperature
entity: climate.forgang name: Roth aktuelt
name: Forgang - entity: climate.forgang
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid - type: grid
cards: cards:
- type: thermostat - type: custom:apexcharts-card
entity: climate.lille_bad graph_span: 24h
name: Lille bad header:
show: true
title: Lille bad
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: climate.lille_bad
attribute: current_temperature
name: Roth aktuelt
- entity: climate.lille_bad
attribute: temperature
name: Roth mål
stroke_width: 1
curve: stepline
color: "#ff8800"
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Bryggers
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.temp_bryggers_temperatur
name: Temperatur
# TODO: tilføj climate-entity når tænd/sluk er monteret
# - entity: climate.bryggers
# attribute: current_temperature
# name: Roth aktuelt
# - entity: climate.bryggers
# attribute: temperature
# name: Roth mål
# stroke_width: 1
# curve: stepline
# color: "#ff8800"
- type: grid
cards:
- type: custom:apexcharts-card
graph_span: 24h
header:
show: true
title: Køkken
show_states: true
colorize_states: true
now:
show: true
label: Nu
apex_config:
chart:
height: 240
grid:
strokeDashArray: 2
xaxis:
type: datetime
labels:
datetimeFormatter:
hour: HH:mm
yaxis:
decimalsInFloat: 1
tickAmount: 6
series:
- entity: sensor.temp_kokken_temperatur
name: Temperatur
# TODO: tilføj climate-entity når tænd/sluk er monteret
# - entity: climate.kokken
# attribute: current_temperature
# name: Roth aktuelt
# - entity: climate.kokken
# attribute: temperature
# name: Roth mål
# stroke_width: 1
# curve: stepline
# color: "#ff8800"
# Indstillinger: Komforttemperaturer og sænkninger
- type: grid
cards:
- type: entities
title: Komforttemperaturer
entities:
- entity: input_number.varme_komfort_andreas
- entity: input_number.varme_komfort_daniel
- entity: input_number.varme_komfort_sovevaerelse
- entity: input_number.varme_komfort_kontor
- entity: input_number.varme_komfort_gang
- entity: input_number.varme_komfort_forgang
- entity: input_number.varme_komfort_lille_bad
- entity: input_number.varme_komfort_badevarelse
- entity: input_number.varme_komfort_stue
# TODO: aktiver når climate-entiteter er oprettet
# - entity: input_number.varme_komfort_bryggers
# - entity: input_number.varme_komfort_kokken
- type: entities
title: Sænkninger og ferie
entities:
- entity: input_datetime.varme_morgen_tid
- entity: input_datetime.varme_aften_tid
- entity: input_number.varme_nat_saenkning
- entity: input_number.varme_vaek_saenkning
- entity: input_number.varme_ferie_temp
- type: button
name: Genberegn varme nu
icon: mdi:refresh
tap_action:
action: call-service
service: script.varme_recalculate
- type: button
name: Gem temperaturer som standard
icon: mdi:content-save
tap_action:
action: perform-action
perform_action: script.varme_save_defaults
# Ventilposition
- type: grid
cards:
- type: gauge
entity: sensor.fjernvarme_ventil_3_ugers_gennemsnit
name: Anbefalet ventilposition 3 ugers snit (15)
min: 1
max: 5
needle: true
segments:
- from: 1
color: "#44aa44" # grøn: lukket/sommer
- from: 2
color: "#aaaa00" # gul: mildt
- from: 3
color: "#dd8800" # orange: køligt
- from: 4
color: "#cc4400" # rød-orange: koldt
- from: 4.5
color: "#aa0000" # rød: frost
- type: markdown
content: |-
**Anbefalet stilling (3 ugers snit): {{ states('sensor.fjernvarme_ventil_3_ugers_gennemsnit') | float(0) | round(1) }}**
Øjeblikkelig (vejrbaseret): {{ states('sensor.fjernvarme_ventil_anbefalet') }} {{ state_attr('sensor.fjernvarme_ventil_anbefalet', 'anbefaling') }}
Udetemperatur nu: {{ state_attr('sensor.fjernvarme_ventil_anbefalet', 'udetemperatur') }}°C
Gælder for begge manuelle hoveddrejehaner:
- Roth-fordeler (sauna)
- Fjernvarme indstikning (bryggers)
+352
View File
@@ -0,0 +1,352 @@
title: Sikkerhed
path: sikkerhed
icon: mdi:shield-home
cards:
# ─────────────────────────────────────────────────────────────
# 📷 KAMERAER
# ─────────────────────────────────────────────────────────────
- type: grid
columns: 2
square: false
cards:
- type: picture-entity
entity: camera.terrasse_sub
name: Terasse
camera_view: live
show_state: false
show_name: true
tap_action:
action: fire-dom-event
browser_mod:
service: browser_mod.popup
data:
title: Terasse Live
content:
type: vertical-stack
cards:
- type: picture-entity
entity: camera.terrasse_sub
camera_view: live
show_name: false
show_state: false
tap_action:
action: none
- type: tile
entity: number.terrasse_focus
name: Fokus
icon: mdi:focus-field
features:
- type: numeric-input
style: slider
- type: tile
entity: number.terrasse_zoom
name: Zoom
icon: mdi:magnify
features:
- type: numeric-input
style: slider
- type: picture-entity
entity: camera.indkoersel_sub
name: Indkørsel
camera_view: live
show_state: false
show_name: true
tap_action:
action: fire-dom-event
browser_mod:
service: browser_mod.popup
data:
title: Indkørsel Live
content:
type: vertical-stack
cards:
- type: picture-entity
entity: camera.indkoersel_sub
camera_view: live
show_name: false
show_state: false
tap_action:
action: none
- type: tile
entity: number.indkoersel_focus
name: Fokus
icon: mdi:focus-field
features:
- type: numeric-input
style: slider
- type: tile
entity: number.indkoersel_zoom
name: Zoom
icon: mdi:magnify
features:
- type: numeric-input
style: slider
# ─────────────────────────────────────────────────────────────
# 🛡️ SIKKERHEDSSTATUS
# ─────────────────────────────────────────────────────────────
- type: heading
heading: Sikkerhedsstatus
heading_style: title
- type: grid
columns: 2
square: false
cards:
# 👥 Tilstedeværelse
- type: custom:mushroom-template-card
entity: binary_sensor.family_presence
primary: >
{{ 'Nogen hjemme' if is_state('binary_sensor.family_presence', 'on') else 'Ingen hjemme' }}
secondary: >
{% set persons = [
('Claus', 'person.claus_dethlefsen'),
('Anne', 'person.anne_schusler_dethlefsen'),
('Andreas', 'person.andreas_schusler_dethlefsen'),
('Daniel', 'person.daniel_schusler_dethlefsen')
] %}
{% set ns = namespace(home=[]) %}
{% for name, eid in persons %}
{% if is_state(eid, 'home') %}{% set ns.home = ns.home + [name] %}{% endif %}
{% endfor %}
{{ ns.home | join(', ') if ns.home else 'Alle ude' }}
icon: >
{{ 'mdi:home-account' if is_state('binary_sensor.family_presence', 'on') else 'mdi:home-outline' }}
icon_color: >
{{ 'green' if is_state('binary_sensor.family_presence', 'on') else 'blue' }}
tap_action:
action: none
# 💡 Lys
- type: custom:mushroom-template-card
entity: light.alle_lys
primary: >
{{ 'Lys er tændt' if is_state('light.alle_lys', 'on') else 'Alt lys slukket' }}
secondary: ""
icon: >
{{ 'mdi:lightbulb-on' if is_state('light.alle_lys', 'on') else 'mdi:lightbulb-off' }}
icon_color: >
{{ 'yellow' if is_state('light.alle_lys', 'on') else 'grey' }}
tap_action:
action: navigate
navigation_path: /lovelace/lys
# 🪟 Vinduer og terrassedør
- type: custom:mushroom-template-card
multiline_secondary: true
primary: >
{% set sensors = [
'binary_sensor.andreas_vindue',
'binary_sensor.daniel_vindue',
'binary_sensor.sovevaerelse_vindue',
'binary_sensor.badevaerelse_vindue',
'binary_sensor.lille_bad_vindue',
'binary_sensor.terrassedor'
] %}
{% set ns = namespace(open=0) %}
{% for s in sensors %}{% if is_state(s, 'on') %}{% set ns.open = ns.open + 1 %}{% endif %}{% endfor %}
{{ 'Alle vinduer lukket' if ns.open == 0 else ns.open | string + ' vindue(r) åben' }}
secondary: >
{% set sensor_map = {
'binary_sensor.andreas_vindue': 'Andreas',
'binary_sensor.daniel_vindue': 'Daniel',
'binary_sensor.sovevaerelse_vindue': 'Soveværelse',
'binary_sensor.badevaerelse_vindue': 'Badeværelse',
'binary_sensor.lille_bad_vindue': 'Lille bad',
'binary_sensor.terrassedor': 'Terrassedør'
} %}
{% set ns = namespace(aabne=[]) %}
{% for s, n in sensor_map.items() %}{% if is_state(s, 'on') %}{% set ns.aabne = ns.aabne + [n] %}{% endif %}{% endfor %}
{{ ns.aabne | join(', ') if ns.aabne else '' }}
icon: >
{% set sensors = [
'binary_sensor.andreas_vindue',
'binary_sensor.daniel_vindue',
'binary_sensor.sovevaerelse_vindue',
'binary_sensor.badevaerelse_vindue',
'binary_sensor.lille_bad_vindue',
'binary_sensor.terrassedor'
] %}
{% set ns = namespace(open=0) %}
{% for s in sensors %}{% if is_state(s, 'on') %}{% set ns.open = ns.open + 1 %}{% endif %}{% endfor %}
{{ 'mdi:window-open-variant' if ns.open > 0 else 'mdi:window-closed-variant' }}
icon_color: >
{% set sensors = [
'binary_sensor.andreas_vindue',
'binary_sensor.daniel_vindue',
'binary_sensor.sovevaerelse_vindue',
'binary_sensor.badevaerelse_vindue',
'binary_sensor.lille_bad_vindue',
'binary_sensor.terrassedor'
] %}
{% set ns = namespace(open=0) %}
{% for s in sensors %}{% if is_state(s, 'on') %}{% set ns.open = ns.open + 1 %}{% endif %}{% endfor %}
{{ 'red' if ns.open > 0 else 'green' }}
tap_action:
action: none
# 🚗 Garage
- type: custom:mushroom-template-card
entity: binary_sensor.garageport
primary: >
{{ 'Garage åben' if is_state('binary_sensor.garageport', 'on') else 'Garage lukket' }}
secondary: >
Sidst ændret: {{ relative_time(states.binary_sensor.garageport.last_changed) }} siden
icon: >
{{ 'mdi:garage-open-variant' if is_state('binary_sensor.garageport', 'on') else 'mdi:garage-variant' }}
icon_color: >
{{ 'orange' if is_state('binary_sensor.garageport', 'on') else 'green' }}
tap_action:
action: call-service
service: cover.toggle
target:
entity_id: cover.anne
# 🏖️ Ferietilstand
- type: custom:mushroom-template-card
entity: input_boolean.vacation_mode
primary: >
{{ 'Ferie aktiv' if is_state('input_boolean.vacation_mode', 'on') else 'Normal tilstand' }}
secondary: >
{% if is_state('input_boolean.vacation_mode', 'on') %}
{% set end = states('input_datetime.vacation_end') %}
{% if end not in ['unknown', 'unavailable', ''] %}Slutter {{ as_datetime(end).strftime('%-d. %b') }}{% endif %}
{% endif %}
icon: >
{{ 'mdi:beach' if is_state('input_boolean.vacation_mode', 'on') else 'mdi:home' }}
icon_color: >
{{ 'cyan' if is_state('input_boolean.vacation_mode', 'on') else 'grey' }}
tap_action:
action: more-info
# 🤖 AI-overvågning (indkørsel)
- type: custom:mushroom-template-card
primary: >
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
{{ 'AI-overvågning pauset' if paused else 'AI-overvågning aktiv' }}
secondary: >
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
{% if paused %}Genoptages kl. {{ as_datetime(pause).strftime('%H:%M') }}{% else %}Indkørsel overvåges{% endif %}
icon: >
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
{{ 'mdi:robot-off' if paused else 'mdi:robot' }}
icon_color: >
{% set pause = states('input_datetime.ai_indkorsel_ai_pause_until') %}
{% set paused = pause not in ['unknown', 'unavailable', ''] and as_timestamp(pause) > as_timestamp(now()) %}
{{ 'orange' if paused else 'green' }}
tap_action:
action: more-info
entity: input_datetime.ai_indkorsel_ai_pause_until
# 🔒 Terrassedør (separat overblik)
- type: custom:mushroom-template-card
entity: binary_sensor.terrassedor
primary: >
{{ 'Terrassedør åben' if is_state('binary_sensor.terrassedor', 'on') else 'Terrassedør lukket' }}
secondary: >
Sidst ændret: {{ relative_time(states.binary_sensor.terrassedor.last_changed) }} siden
icon: >
{{ 'mdi:door-open' if is_state('binary_sensor.terrassedor', 'on') else 'mdi:door-closed' }}
icon_color: >
{{ 'red' if is_state('binary_sensor.terrassedor', 'on') else 'green' }}
tap_action:
action: more-info
# 📡 Bevægelse i indkørslen lige nu
- type: custom:mushroom-template-card
entity: binary_sensor.indkorsel_sensor_motion
primary: >
{{ 'Bevægelse registreret!' if is_state('binary_sensor.indkorsel_sensor_motion', 'on') else 'Ingen bevægelse' }}
secondary: >
Sidst: {{ relative_time(states.binary_sensor.indkorsel_sensor_motion.last_changed) }} siden
icon: >
{{ 'mdi:motion-sensor' if is_state('binary_sensor.indkorsel_sensor_motion', 'on') else 'mdi:motion-sensor-off' }}
icon_color: >
{{ 'red' if is_state('binary_sensor.indkorsel_sensor_motion', 'on') else 'grey' }}
tap_action:
action: none
# ─────────────────────────────────────────────────────────────
# 📋 SENESTE BEVÆGELSE INDKØRSEL (AI-log)
# ─────────────────────────────────────────────────────────────
- type: heading
heading: Seneste bevægelse Indkørsel
heading_style: title
# Seneste snapshot gemt af AI-overvågningsscriptet
- type: picture-entity
entity: camera.indkorsel_snapshot
show_name: false
show_state: false
tap_action:
action: fire-dom-event
browser_mod:
service: browser_mod.popup
data:
title: Seneste bevægelse Indkørsel
content:
type: picture-entity
entity: camera.indkorsel_snapshot
show_name: false
show_state: false
tap_action:
action: none
# Seneste AI-beskrivelse
- type: custom:button-card
entity: input_text.last_notification_message
show_name: false
show_icon: true
show_state: true
icon: mdi:robot
styles:
card:
- padding: 14px 16px
- text-align: left
grid:
- grid-template-areas: '"i s"'
- grid-template-columns: 44px 1fr
- grid-template-rows: auto
icon:
- width: 32px
- height: 32px
- color: var(--primary-color)
- align-self: flex-start
- margin-top: 2px
state:
- white-space: normal
- word-break: break-word
- font-size: 13px
- text-align: left
- line-height: "1.5"
tap_action:
action: none
# ─────────────────────────────────────────────────────────────
# 📸 SENESTE PERSON-SNAPSHOT INDKØRSEL
# ─────────────────────────────────────────────────────────────
- type: heading
heading: Seneste person i indkørsel
heading_style: subtitle
# Klik åbner galleri med alle tidligere snapshots
- type: picture
image: /local/snapshots/indkorsel/latest.jpg
tap_action:
action: navigate
navigation_path: /lovelace/indkorsel-snapshots
# Logbog over bevægelseshændelser (48 timer)
- type: logbook
entities:
- binary_sensor.indkorsel_sensor_motion
hours_to_show: 48
title: Bevægelseslog (48 timer)
@@ -0,0 +1,9 @@
title: Snapshots Indkørsel
path: indkorsel-snapshots
icon: mdi:camera-burst
panel: true
cards:
- type: iframe
url: /local/snapshots/indkorsel_loader.html?v=20260516103651
aspect_ratio: 100%
+122 -1
View File
@@ -63,7 +63,128 @@ sections:
name: Ladehastighed name: Ladehastighed
# 💡 Automations / kontrol # Zigbee stik med strømmåling
- type: grid
cards:
- type: heading
heading: Zigbee stik
# Aktuel effekt alle stik samlet
- type: history-graph
title: Effekt lige nu (W)
entities:
- entity: sensor.stik_alrum_effekt
name: Alrum
- entity: sensor.stik_kontor_effekt
name: Kontor
- entity: sensor.stik_bad_effekt
name: Badeværelse
- entity: sensor.stik_lillebad_effekt
name: Lille bad
- entity: sensor.stik_sonos_stue_effekt
name: Sonos stue
- entity: sensor.stik_quooker_effekt
name: Quooker
- entity: sensor.stik_fryser_effekt
name: Fryser
- entity: sensor.stik_bryggers_effekt
name: Bryggers
hours_to_show: 6
refresh_interval: 30
# Individuelle stik med tænd/sluk + effekt
- type: tile
entity: switch.stik_alrum
name: Alrum
secondary_info: sensor.stik_alrum_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_kontor
name: Kontor
secondary_info: sensor.stik_kontor_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_bad
name: Badeværelse
secondary_info: sensor.stik_bad_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_lillebad
name: Lille bad
secondary_info: sensor.stik_lillebad_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_sonos_stue
name: Sonos stue
secondary_info: sensor.stik_sonos_stue_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_quooker
name: Quooker
secondary_info: sensor.stik_quooker_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_fryser
name: Fryser
secondary_info: sensor.stik_fryser_effekt
icon: mdi:power-plug
features:
- type: toggle
- type: tile
entity: switch.stik_bryggers
name: Bryggers
secondary_info: sensor.stik_bryggers_effekt
icon: mdi:power-plug
features:
- type: toggle
# Akkumuleret energiforbrug (kWh) pr. stik
- type: statistics-graph
title: Energiforbrug (kWh)
entities:
- entity: sensor.stik_alrum_summation_delivered
name: Alrum
- entity: sensor.stik_kontor_summation_delivered
name: Kontor
- entity: sensor.stik_bad_summation_delivered
name: Badeværelse
- entity: sensor.stik_lillebad_summation_delivered
name: Lille bad
- entity: sensor.stik_sonos_stue_summation_delivered
name: Sonos stue
- entity: sensor.stik_quooker_summation_delivered
name: Quooker
- entity: sensor.stik_fryser_summation_delivered
name: Fryser
- entity: sensor.stik_bryggers_summation_delivered
name: Bryggers
period: day
days_to_show: 7
chart_type: bar
stat_types:
- change
# 💡 Automations / kontrol
- type: grid - type: grid
cards: cards:
- type: heading - type: heading
+34 -17
View File
@@ -7,7 +7,7 @@ cards:
- type: vertical-stack - type: vertical-stack
cards: cards:
- type: gauge - type: gauge
entity: sensor.snowywhite_battery_numeric entity: sensor.batteri
name: Batteri name: Batteri
min: 0 min: 0
max: 100 max: 100
@@ -18,7 +18,7 @@ cards:
unit: '%' unit: '%'
- type: gauge - type: gauge
entity: sensor.snowywhite_range_numeric entity: sensor.raekkevidde_km
name: Rækkevidde name: Rækkevidde
min: 0 min: 0
max: 600 max: 600
@@ -32,9 +32,9 @@ cards:
entities: entities:
- entity: binary_sensor.snowywhite_charging - entity: binary_sensor.snowywhite_charging
name: Oplader nu? name: Oplader nu?
- entity: sensor.snowywhite_charging_rate_numeric - entity: sensor.charging_rate_km_h
name: Ladehastighed (km/t) name: Ladehastighed (km/t)
- entity: sensor.snowywhite_energy_added_numeric - entity: sensor.energy_added_kwh
name: Energi tilføjet (kWh) name: Energi tilføjet (kWh)
- entity: sensor.snowywhite_charger_power - entity: sensor.snowywhite_charger_power
name: Charger power (kW) name: Charger power (kW)
@@ -45,31 +45,48 @@ cards:
cards: cards:
- type: button - type: button
name: Start opladning name: Start opladning
icon: mdi:flash-circle icon: mdi:flash
tap_action: tap_action:
action: call-service action: call-service
service: switch.turn_on service: script.tesla_force_start_charging
target:
entity_id: switch.home_charging
- type: button - type: button
name: Stop opladning name: Stop opladning
icon: mdi:flash-off icon: mdi:flash-off
tap_action: tap_action:
action: call-service action: call-service
service: switch.turn_off service: script.tesla_force_stop_charging
target:
entity_id: switch.home_charging
# 🕒 Opladning Timeline (graf) # 🕒 Opladningsplan
- type: history-graph - type: entities
title: Ladeplan / Timeline title: Opladningsplan
entities: entities:
- entity: sensor.snowywhite_charging_numeric - entity: input_boolean.tesla_manual_override
name: Manuel override
- entity: binary_sensor.tesla_charge_now
name: Skal lade nu
- entity: sensor.tesla_charge_plan
name: Billigste vindue
- entity: sensor.tesla_charge_hours_needed
name: Timer nødvendige
- entity: input_datetime.tesla_charge_deadline
name: Klar senest
- entity: input_datetime.tesla_last_start
name: Sidste start
- entity: number.snowywhite_charge_limit
name: Lademål
- entity: binary_sensor.snowywhite_charger
name: Tilsluttet lader
# 📈 Faktisk opladning
- type: history-graph
title: Faktisk opladning sidste 24 timer
entities:
- entity: sensor.charging_numeric
name: Lader nu name: Lader nu
- entity: sensor.snowywhite_charging_rate_numeric - entity: sensor.charging_rate_km_h
name: Ladehastighed name: Ladehastighed
- entity: sensor.snowywhite_energy_added_numeric - entity: sensor.energy_added_kwh
name: Energi tilføjet name: Energi tilføjet
hours_to_show: 24 hours_to_show: 24
refresh_interval: 60 refresh_interval: 60
+278 -1
View File
@@ -13,6 +13,75 @@ sections:
entity: input_boolean.vis_alle_vedligehold entity: input_boolean.vis_alle_vedligehold
name: Vis alle name: Vis alle
- type: grid
cards:
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: heading
heading: Tesla
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: state
entity: binary_sensor.vedligehold_tesla
state: "on"
card:
type: heading
heading: Tesla
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.snowywhite_battery
name: Batteri
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.snowywhite_battery
below: 20
card:
type: tile
entity: sensor.snowywhite_battery
name: Batteri
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: update.snowywhite_software_update
name: Software update
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: state
entity: update.snowywhite_software_update
state: "on"
card:
type: tile
entity: update.snowywhite_software_update
name: Software update
- type: grid - type: grid
cards: cards:
- type: conditional - type: conditional
@@ -979,6 +1048,54 @@ sections:
entity: sensor.dishwasher_rinse_aid_level entity: sensor.dishwasher_rinse_aid_level
name: Afspaending name: Afspaending
- type: grid
cards:
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: heading
heading: Plæneklipper
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: state
entity: lawn_mower.husqvarna_automower
state: error
card:
type: heading
heading: Plæneklipper
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: lawn_mower.husqvarna_automower
name: Automower
show_state: true
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: state
entity: lawn_mower.husqvarna_automower
state: error
card:
type: tile
entity: lawn_mower.husqvarna_automower
name: Automower
show_state: true
- type: grid - type: grid
cards: cards:
- type: conditional - type: conditional
@@ -1460,4 +1577,164 @@ sections:
card: card:
type: tile type: tile
entity: sensor.hojre_battery entity: sensor.hojre_battery
name: Gardin hojre name: Gardin hojre
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.garageport_batteri
name: Garageport sensor
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.garageport_batteri
below: 20
card:
type: tile
entity: sensor.garageport_batteri
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.sovevaerelse_vindue_batteri
name: Soveværelse vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.sovevaerelse_vindue_batteri
below: 20
card:
type: tile
entity: sensor.sovevaerelse_vindue_batteri
name: Soveværelse vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.daniel_vindue_batteri
name: Daniel vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.daniel_vindue_batteri
below: 20
card:
type: tile
entity: sensor.daniel_vindue_batteri
name: Daniel vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.andreas_vindue_batteri
name: Andreas vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.andreas_vindue_batteri
below: 20
card:
type: tile
entity: sensor.andreas_vindue_batteri
name: Andreas vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.badevaerelse_vindue_batteri
name: Badeværelse vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.badevaerelse_vindue_batteri
below: 20
card:
type: tile
entity: sensor.badevaerelse_vindue_batteri
name: Badeværelse vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.lille_bad_vindue_batteri
name: Lille bad vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.lille_bad_vindue_batteri
below: 20
card:
type: tile
entity: sensor.lille_bad_vindue_batteri
name: Lille bad vindue
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "on"
card:
type: tile
entity: sensor.terrassedor_batteri
name: Terrassedør
- type: conditional
conditions:
- condition: state
entity: input_boolean.vis_alle_vedligehold
state: "off"
- condition: numeric_state
entity: sensor.terrassedor_batteri
below: 20
card:
type: tile
entity: sensor.terrassedor_batteri
name: Terrassedør
+842
View File
@@ -0,0 +1,842 @@
title: Lys
path: lys
icon: mdi:lightbulb-multiple
type: sections
max_columns: 3
sections:
- type: grid
columns: 3
square: false
cards:
- type: heading
heading: Globalt
- type: custom:mushroom-light-card
entity: light.alle_lys
name: Alle lys
icon: mdi:lightbulb-group
use_light_color: true
show_brightness_control: true
collapsible_controls: true
secondary_info: state
- type: custom:mushroom-light-card
entity: light.indendorslamper
name: Indendors
icon: mdi:home-lightbulb
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.udendorslamper
name: Udendors
icon: mdi:outdoor-lamp
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-template-card
primary: Taend alt
secondary: Hele huset
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id: light.alle_lys
- type: custom:mushroom-template-card
primary: Sluk alt
secondary: Hele huset
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id: light.alle_lys
- type: custom:mushroom-template-card
primary: Taend inde
secondary: Alle indendors
icon: mdi:home-lightbulb
tap_action:
action: call-service
service: light.turn_on
data:
entity_id: light.indendorslamper
- type: custom:mushroom-template-card
primary: Sluk inde
secondary: Alle indendors
icon: mdi:home-lightbulb-outline
tap_action:
action: call-service
service: light.turn_off
data:
entity_id: light.indendorslamper
- type: custom:mushroom-template-card
primary: Taend ude
secondary: Alle udendors
icon: mdi:string-lights
tap_action:
action: call-service
service: light.turn_on
data:
entity_id: light.udendorslamper
- type: custom:mushroom-template-card
primary: Sluk ude
secondary: Alle udendors
icon: mdi:string-lights-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id: light.udendorslamper
- type: grid
cards:
- type: heading
heading: Stue
- type: custom:mushroom-light-card
entity: light.livingroom
name: Stue samlet
icon: mdi:sofa
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Bright
secondary: Scene
icon: mdi:brightness-7
tap_action:
action: call-service
service: scene.turn_on
data:
entity_id: scene.stue_bright
- type: custom:mushroom-template-card
primary: Annes favorit
secondary: Scene
icon: mdi:heart-outline
tap_action:
action: call-service
service: scene.turn_on
data:
entity_id: scene.stue_annes_favorit
- type: custom:mushroom-template-card
primary: Relax
secondary: Scene
icon: mdi:sofa-outline
tap_action:
action: call-service
service: scene.turn_on
data:
entity_id: scene.stue_relax_minus_syd
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.monthly_color_scene
- type: custom:mushroom-template-card
primary: Raketloop
secondary: Script
icon: mdi:rocket-launch
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.raketloop
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.raket
name: Raket
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.spisebord
name: Spisebord
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.syd
name: Syd
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.panton
name: Panton
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.pendle1
name: Pendle 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.pendle2
name: Pendle 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Andreas
- type: custom:mushroom-light-card
entity: light.andreas_vaerelse
name: Andreas samlet
icon: mdi:bed
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Standard
secondary: Script
icon: mdi:white-balance-sunny
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.andreas_standard_colors
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.andreas_color_scene
- type: custom:mushroom-template-card
primary: Andreasloop
secondary: Toggle
icon: mdi:sync
entity: switch.andreas_colorloop_toggle
tap_action:
action: toggle
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-light-card
entity: light.andreas_lysstrip
name: Lysstrip
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.andreas_stol
name: Stol
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Daniel
- type: custom:mushroom-light-card
entity: light.daniels_vaerelse
name: Daniel samlet
icon: mdi:bed
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Standard
secondary: Script
icon: mdi:white-balance-sunny
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.daniel_standard_colors
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.daniel_color_scene
- type: custom:mushroom-template-card
primary: Danielloop
secondary: Toggle
icon: mdi:sync
entity: switch.daniel_colorloop_toggle
tap_action:
action: toggle
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-light-card
entity: light.daniel_lysstrip
name: Lysstrip
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bamse
name: Bamse
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Sovevaerelse
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Taend alle
secondary: Sovevaerelse
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
- type: custom:mushroom-template-card
primary: Sluk alle
secondary: Sovevaerelse
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
- type: custom:mushroom-template-card
primary: Standard
secondary: Script
icon: mdi:weather-night
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.bed_standard_colors
- type: custom:mushroom-template-card
primary: Manedens farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.bed_color_scene
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-light-card
entity: light.claus
name: Claus
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.anne
name: Anne
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sov_dor
name: Dor
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sov_midt
name: Midt
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sov_vindue
name: Vindue
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Badevaerelse
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Taend alle
secondary: Badevaerelse
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id:
- light.bad_nw
- light.bad_ne
- light.bad_sw
- light.bad_se
- light.spejl1
- light.spejl2
- light.badevaerelse_2
- type: custom:mushroom-template-card
primary: Sluk alle
secondary: Badevaerelse
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id:
- light.bad_nw
- light.bad_ne
- light.bad_sw
- light.bad_se
- light.spejl1
- light.spejl2
- light.badevaerelse_2
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.bad_nw
name: Bad NV
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bad_ne
name: Bad NO
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bad_sw
name: Bad SV
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.bad_se
name: Bad SO
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.spejl1
name: Spejl 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.spejl2
name: Spejl 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.badevaerelse_2
name: Ekstra bad
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Gang og forgang
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Taend gang
secondary: Fordelingsgang
icon: mdi:lightbulb-on
tap_action:
action: call-service
service: light.turn_on
data:
entity_id:
- light.fordelingsgang_1
- light.fordelingsgang_2
- light.fordelingsgang_3
- light.fordelingsgang_4
- light.fordelingsgang_5
- type: custom:mushroom-template-card
primary: Sluk gang
secondary: Fordelingsgang
icon: mdi:lightbulb-off
tap_action:
action: call-service
service: light.turn_off
data:
entity_id:
- light.fordelingsgang_1
- light.fordelingsgang_2
- light.fordelingsgang_3
- light.fordelingsgang_4
- light.fordelingsgang_5
- type: custom:mushroom-light-card
entity: light.forgang
name: Forgang
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.fordelingsgang_1
name: Gang 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_2
name: Gang 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_3
name: Gang 3
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_4
name: Gang 4
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordelingsgang_5
name: Gang 5
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Ude og have
- type: custom:mushroom-light-card
entity: light.udendorslamper
name: Alle udelys
icon: mdi:pine-tree
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 2
square: false
cards:
- type: custom:mushroom-template-card
primary: Have standard
secondary: Script
icon: mdi:flower-outline
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.have_standard_colors
- type: custom:mushroom-template-card
primary: Have farver
secondary: Script
icon: mdi:palette
tap_action:
action: call-service
service: script.turn_on
data:
entity_id: script.have_color_scene
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.garage
name: Garage
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.fordoer
name: Fordor
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.udendors_forgang
name: Forgang ude
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.indkorsel_plug
name: Indkorsel
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.hue_outdoor_spot_1
name: Have spot 1
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.hue_outdoor_spot_2
name: Have spot 2
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.hue_outdoor_spot_3
name: Have spot 3
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Julelys
- type: custom:mushroom-light-card
entity: light.julelys
name: Alt julelys
icon: mdi:string-lights
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.ronnebaer
name: Ronnebaer
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.koste
name: Koste
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.terasse
name: Terrasse
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.paradis
name: Paradis
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.udetrae
name: Udetrae
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.on_off_plug_2
name: Juleplug
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Ovrige
- type: grid
columns: 3
square: false
cards:
- type: custom:mushroom-light-card
entity: light.sauna
name: Sauna
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.strip
name: Strip
use_light_color: true
show_brightness_control: true
show_color_control: true
show_color_temp_control: true
collapsible_controls: true
- type: custom:mushroom-light-card
entity: light.sonoff_10006a2cdd
name: Sonoff ekstra
use_light_color: true
show_brightness_control: true
collapsible_controls: true
- type: grid
cards:
- type: heading
heading: Motion-indstillinger
- type: entities
title: Gang
entities:
- entity: input_number.gang_lux_threshold
name: Lux grænse
- entity: input_number.gang_timeout_day
name: Timeout dag
- entity: input_number.gang_timeout_night
name: Timeout nat
- type: entities
title: Badeværelse
entities:
- entity: input_number.badevaerelse_timeout_day
name: Timeout dag
- entity: input_number.badevaerelse_timeout_night
name: Timeout nat
- type: entities
title: Andreas
entities:
- entity: input_number.andreas_lux_threshold
name: Lux grænse
- entity: input_number.andreas_timeout
name: Timeout
- entity: input_number.andreas_brightness
name: Lysstyrke
- type: entities
title: Daniel
entities:
- entity: input_number.daniel_lux_threshold
name: Lux grænse
- entity: input_number.daniel_timeout
name: Timeout
- entity: input_number.daniel_brightness
name: Lysstyrke
- type: entities
title: Kontor
entities:
- entity: input_number.kontor_lux_threshold
name: Lux grænse
- entity: input_number.kontor_timeout_day
name: Timeout dag
- entity: input_number.kontor_timeout_night
name: Timeout nat
- type: entities
title: Stue
entities:
- entity: input_number.stue_lux_threshold
name: Lux grænse
- entity: input_number.stue_timeout_morgen
name: Timeout morgen (06-16)
- entity: input_number.stue_timeout_eftermiddag
name: Timeout eftermiddag (16-19)
- entity: input_number.stue_timeout_aften
name: Timeout aften/TV off (19-00)
- entity: input_number.stue_timeout_nat
name: Timeout nat (00-06)
+13
View File
@@ -0,0 +1,13 @@
services:
home-assistant:
container_name: homeassistant
image: homeassistant/home-assistant:latest
volumes:
- /volume1/homeassistant:/config
- /volume1/docker/homeassistant/backups:/backups
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
network_mode: host
restart: always
environment:
- TZ=Europe/Copenhagen
+19
View File
@@ -0,0 +1,19 @@
DOCKER_ROOT=/volume1/docker
GITEA_IMAGE_TAG=latest
GITEA_DB_IMAGE_TAG=17
GITEA_DB_DATA_PATH=/volume1/docker/gitea/db
GITEA_DATA_PATH=/volume1/docker/gitea/data
GITEA_CUSTOM_PATH=/data/gitea
GITEA_DB_NAME=gitea
GITEA_DB_USER=change_me
GITEA_DB_PASSWORD=change_me
PUID=1038
PGID=100
GITEA_HTTP_PORT=12080
GITEA_SSH_PORT=12022
GITEA_DOMAIN=dethlefsen
GITEA_ROOT_URL=http://dethlefsen:12080/
GITEA_SSH_DOMAIN=dethlefsen
+13
View File
@@ -0,0 +1,13 @@
services:
home-assistant:
container_name: homeassistant
image: homeassistant/home-assistant:latest
volumes:
- /volume1/homeassistant:/config
- /volume1/docker/homeassistant/backups:/backups
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
network_mode: host
restart: always
environment:
- TZ=Europe/Copenhagen
+92
View File
@@ -0,0 +1,92 @@
## Denne stack er justeret mod den nuvaerende Synology Gitea-DB opsaetning.
## Hvis den eksisterende Gitea-container bruger andre porte eller paths, skal de tilpasses i .env.infrastructure.
services:
mosquitto:
container_name: mosquitto
image: eclipse-mosquitto:2
restart: unless-stopped
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ${DOCKER_ROOT:-/volume1/docker}/mosquitto/config:/mosquitto/config
- ${DOCKER_ROOT:-/volume1/docker}/mosquitto/data:/mosquitto/data
- ${DOCKER_ROOT:-/volume1/docker}/mosquitto/log:/mosquitto/log
healthcheck:
test: ["CMD-SHELL", "mosquitto_sub -h 127.0.0.1 -p 1883 -t '$$SYS/broker/version' -C 1 -W 3 >/dev/null 2>&1 || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 20s
gitea-db:
container_name: gitea-db
image: postgres:${GITEA_DB_IMAGE_TAG:-17}
restart: unless-stopped
environment:
POSTGRES_DB: ${GITEA_DB_NAME:-gitea}
POSTGRES_USER: ${GITEA_DB_USER:-giteauser}
POSTGRES_PASSWORD: ${GITEA_DB_PASSWORD}
volumes:
- ${GITEA_DB_DATA_PATH:-/volume1/docker/gitea/db}:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${GITEA_DB_USER:-giteauser} -d ${GITEA_DB_NAME:-gitea}"]
interval: 15s
timeout: 5s
retries: 10
start_period: 20s
nginx-proxy-manager:
container_name: nginx-proxy-manager
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "10080:80" # HTTP (inkl. Let's Encrypt HTTP-01 challenge) router forwarder 80→10080
- "10443:443" # HTTPS router forwarder 443→10443
- "10.0.0.142:81:81" # Admin UI kun tilgængeligt fra LAN
volumes:
- ${DOCKER_ROOT:-/volume1/docker}/nginx-proxy-manager/data:/data
- ${DOCKER_ROOT:-/volume1/docker}/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
extra_hosts:
- "host.docker.internal:host-gateway" # Gør det muligt at proxye til HA på host-netværket
healthcheck:
test: ["CMD", "/usr/bin/check-health"]
interval: 10s
timeout: 3s
retries: 3
start_period: 20s
gitea:
container_name: gitea
image: gitea/gitea:${GITEA_IMAGE_TAG:-latest}
restart: unless-stopped
depends_on:
gitea-db:
condition: service_healthy
environment:
USER: git
GITEA_CUSTOM: ${GITEA_CUSTOM_PATH:-/data/gitea}
USER_UID: ${PUID:-1038}
USER_GID: ${PGID:-100}
GITEA__database__DB_TYPE: postgres
GITEA__database__HOST: gitea-db:5432
GITEA__database__NAME: ${GITEA_DB_NAME:-gitea}
GITEA__database__USER: ${GITEA_DB_USER:-giteauser}
GITEA__database__PASSWD: ${GITEA_DB_PASSWORD}
GITEA__server__DOMAIN: ${GITEA_DOMAIN:-dethlefsen}
GITEA__server__ROOT_URL: ${GITEA_ROOT_URL:-http://dethlefsen:12080/}
GITEA__server__SSH_DOMAIN: ${GITEA_SSH_DOMAIN:-dethlefsen}
GITEA__server__SSH_PORT: ${GITEA_SSH_PORT:-12022}
ports:
- "${GITEA_HTTP_PORT:-12080}:3000"
- "${GITEA_SSH_PORT:-12022}:22"
volumes:
- ${GITEA_DATA_PATH:-/volume1/docker/gitea/data}:/data
- /etc/localtime:/etc/localtime:ro
healthcheck:
test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:3000/ || exit 1"]
interval: 30s
timeout: 10s
retries: 10
start_period: 40s
+8
View File
@@ -0,0 +1,8 @@
services:
unifi:
container_name: jacobalberty-unifi-1
image: jacobalberty/unifi:latest
restart: always
network_mode: host
volumes:
- /volume1/docker/unifi:/var/lib/unifi
+48
View File
@@ -0,0 +1,48 @@
# TODO - Pending Tasks
## Home Assistant - Åbne opgaver
### HA-fejl der skal fikses
- [x] **Mealie shopping merge timeout** — udgået, merge med Google Keep droppes. Shopping-liste køres direkte i Mealie hver onsdag morgen.
- [x] **aiohttp 400 Bad Request fra ekstern IP** — Løst: Nginx Proxy Manager sat op som HTTPS reverse proxy (`anneclaus.duckdns.org`). Let's Encrypt cert udstedt, Force HTTPS aktiveret. Port 8123 lukket på routeren. HA tilgås nu udelukkende via HTTPS på port 443.
- [x] **switch.home_charging mangler** — Bilen oplades fint (16. maj 2026). Ikke et reelt problem.
- [x] **climate.badevarelse** — Danfoss Ally TRV monteret og online (7. maj 2026).
- [x] **Husqvarna Automower BLE — genopsæt parring** — Kørte fint. Problemet var at telefon-app'en kørte i baggrunden og holdt BLE-forbindelsen, selvom klipperen var slettet fra appen.
- [x] **Google AI MAX_TOKENS i AI-indkørsel automation** — Ingen fejl observeret i loggen. Fjernet fra aktiv liste.
### HA - Kendte ikke-fejl (ingen handling nødvendig)
- `husqvarna_automower_ble` BLE fejl — normalt når plæneklipperen klipper (men se auth fail-fejl ovenfor)
- `light.spejl1/spejl2` mangler — strøm slukket på kontakt, OK
## Sikring af port forwards via NPM + subdomæner
**Baggrund:** Diverse tjenester er direkte eksponeret via port-forwards på routeren uden kryptering. Disse bør flyttes bag NPM med HTTPS og subdomæner under `anneclaus.dk`.
**Tjenester fra routeren (per 17. maj 2026):**
| Tjeneste | WAN-port | Intern port | Forslag til subdomain |
|---|---|---|---|
| Mealie | 9925 | 9925 | `mealie.anneclaus.dk` |
| Plex | 32400 | 32400 | `plex.anneclaus.dk` (Plex har egen HTTPS — lavere prioritet) |
| Synology DSM | 5000/5001 | 5000/5001 | `nas.anneclaus.dk` |
| Unifi | 8443 | 8443 | (Unifi har egen HTTPS — lavere prioritet) |
| FTP | 21 | 21 | FTP er usikkert — overvej om den skal lukkes |
| MQTT | 1883 | 1883 | MQTT i klartekst — høj risiko |
| SSH | 2222 | 2222 | SSH er krypteret, men tiltrækker brute-force |
**For hver tjeneste der flyttes:**
1. Tilføj CNAME-record hos One.com: `<subdomain>``anneclaus.duckdns.org`
2. Opret proxy host i NPM med SSL-cert og Force HTTPS
3. Luk den direkte port-forward på routeren
- [x] **MQTT port 1883** — lukket på routeren (17. maj 2026). MQTT bruges kun internt af Aqara-knapper til ringklokke — ingen ekstern adgang nødvendig.
- [x] **FTP port 21** — lukket på routeren (17. maj 2026).
- [x] **Mealie**`mealie.anneclaus.dk` via NPM med HTTPS (18. maj 2026). Port 9925 lukket på routeren.
- [x] **Synology DSM**`nas.anneclaus.dk` via NPM med HTTPS (19. maj 2026). Port 5000/5001 lukket på routeren.
- [ ] **SSH port 2222** — overvej at begrænse til nøgle-login og deaktivere password-login
- [~] **Plex** — springer over. Plex krypterer selv sin trafik, og alle klientenheder (telefoner, iPad, Apple TV) skulle opdateres manuelt. Ikke umagen værd.
- [ ] **Unifi** — lavere prioritet, Unifi har allerede HTTPS
---
## Gitea External HTTPS Access
- [x] **gitea.anneclaus.dk via NPM** — CNAME oprettet hos One.com, NPM proxy host med Let's Encrypt + Force SSL, `.env.infrastructure` opdateret, container genstartet. HTTPS 200 OK (20. maj 2026).
+111
View File
@@ -0,0 +1,111 @@
# DALL-E / AI billedgenerator prompts Vandingssystem
Brug disse prompts sammen med dine fotos i ChatGPT (GPT-4o), DALL-E 3,
Midjourney, Gemini eller anden AI-billedgenerator.
**Tip:** ChatGPT med GPT-4o er pt. bedst til at bevare det originale foto
og kun tilføje elementer. Sig: *"Use this photo as a base and add the
following..."*
---
## Prompt 1 Vandhane-station
*Brug med foto af nordmur med vandhane, slangerulle og stikkontakt.*
```
Using this photo of the north wall of a Danish house as reference,
add the following installation while keeping the existing wall,
window, hose reel, water tap and electrical outlet exactly as they are:
- A weatherproof grey IP65 enclosure (approx 30x20x15 cm) mounted on
the wall next to the existing electrical outlet, with a small
OpenSprinkler controller visible through a transparent lid
- A Y-splitter on the existing water tap, with one branch going to
the existing garden hose and the other branch going down to a
small manifold containing: a brass 24V solenoid valve, a blue
Dosatron fertilizer injector, a water filter and a pressure regulator
- A 20-liter white plastic jerrycan on the ground next to the
manifold, connected to the Dosatron with a thin suction tube
- A 25mm black PE irrigation pipe leaving the manifold and
disappearing into the ground, heading across the lawn
- A thin low-voltage cable running parallel to the PE pipe
Photorealistic, same lighting and perspective as the original photo,
Scandinavian garden style, daytime.
```
---
## Prompt 2 Højbede med ventilbox
*Brug med foto af de tre højbede med drivhus i baggrunden.*
```
Using this photo of three Danish raised garden beds (højbede) with
asparagus and rhubarb, add the following irrigation installation
while keeping the beds, plants and greenhouse in the background
exactly as they are:
- A black 25mm PE irrigation pipe coming up from the lawn between
the first raised bed and the second/third raised beds
- A green plastic valve box (approx 40x30 cm, IP65) buried flush
with the gravel path between the beds, with the lid visible at
ground level showing "Irrigation" text
- Black drip irrigation soaker hoses (siveslange) laid on the
soil surface in each of the three raised beds, in a snake pattern
- The PE pipe continuing from the valve box towards the greenhouse
in the background, disappearing under the greenhouse foundation
Photorealistic, same lighting and perspective as the original photo,
Scandinavian garden, summer daytime.
```
---
## Prompt 3 Drivhus indvendigt
*Brug med foto af drivhus indefra med de tre sorte kapillærkasser.*
```
Using this photo of the inside of a Danish hobby greenhouse with
three black self-watering capillary boxes on a shelf, add the
following irrigation installation while keeping the greenhouse
structure, plants, shelving and capillary boxes exactly as they are:
- A black 25mm PE irrigation pipe coming up vertically through one
of the floor tiles near the entrance
- The pipe splitting via a T-fitting into two branches:
1. A black drip irrigation soaker hose laid along the soil bed
2. A thin 16mm tube going up to the shelf with the capillary boxes
- Three small white plastic float valves (mini-flydventil), one
mounted on each of the three capillary boxes, each connected to
the 16mm tube via small black drip fittings
Photorealistic, same lighting and perspective as the original photo,
greenhouse interior, daytime, lush plants.
```
---
## Tips til de forskellige AI-værktøjer
- **ChatGPT (GPT-4o):** Bedst til at bevare originalbillede. Upload foto
+ indsæt prompt. Sig evt. *"only add the new components, do not change
anything else in the photo"* hvis den ændrer for meget.
- **DALL-E 3 standalone:** Genererer ofte ny scene. Brug
*"in the style of this photo"* i stedet for *"using this photo"*.
- **Midjourney:** Brug `/describe` på dit foto først, eller `--sref
<billed-url>` som style reference sammen med prompten.
- **Gemini 2.0 Flash / 2.5:** God billedredigering upload foto og bed
den om at tilføje elementerne.
- **Adobe Firefly / Photoshop Generative Fill:** Bedst hvis du vil
redigere kun bestemte områder af fotoet med en mindre prompt.
## Hvis resultatet bliver underligt
- Prøv: *"only add the new irrigation components, do not change anything
else in the photo, preserve the original lighting and perspective"*
- Del op i mindre prompts (én komponent ad gangen)
- Brug billede-til-billede med lav strength (0.3-0.5) hvis værktøjet
understøtter det
+6
View File
@@ -0,0 +1,6 @@
# Google Keep basis-indkøbsliste
# En vare per linje. Linjer der starter med # ignoreres.
# Eksempel:
# Mælk
# Toiletpapir
# Bananer
@@ -0,0 +1,41 @@
# Cutover-checkliste
Brug denne ved skift fra Synology UI-containere til compose for `mosquitto`, `gitea-db` og `gitea`.
## Foer cutover
1. Bekraeft at [/.env.infrastructure](/Volumes/homeassistant/.env.infrastructure) matcher de nuvaerende mounts, porte og credentials.
2. Tag backup af:
`/volume1/docker/gitea/data`
`/volume1/docker/gitea/db`
`/volume1/docker/mosquitto/config`
`/volume1/docker/mosquitto/data`
`/volume1/docker/mosquitto/log`
3. Bekraeft at gamle UI-containere stadig koerer normalt inden du stopper noget.
## Stop gammel stack
1. Stop `gitea` i Synology UI.
2. Stop `gitea-db` i Synology UI.
3. Stop `mosquitto` i Synology UI.
4. Lad containerne blive liggende i UI, men start dem ikke igen under testen.
## Start compose-stack
1. Kør `docker compose --env-file .env.infrastructure -f docker-compose.infrastructure.yml up -d gitea-db`.
2. Vent til `gitea-db` er healthy.
3. Kør `docker compose --env-file .env.infrastructure -f docker-compose.infrastructure.yml up -d gitea mosquitto`.
## Verificer
1. Aabn Gitea og bekraeft at login virker.
2. Bekraeft at repositories og historik er intakte.
3. Test et `git pull` og et lille `git push`.
4. Bekraeft at Home Assistant reconnecter til MQTT.
5. Test en MQTT-afhaengig funktion, fx en doerklokke.
## Hvis noget er galt
1. Stop compose-containere.
2. Start de gamle UI-containere igen i modsat raekkefoelge: `mosquitto`, `gitea-db`, `gitea`.
3. Fejlsoeg foerst derefter. Den store risiko er forkert mount eller forkert credential, ikke selve compose-formatet.
+85
View File
@@ -0,0 +1,85 @@
# Procedure for fuld netværksgenstart
Brug denne procedure ved fejlfinding, strømafbrydelse eller planlagt vedligehold.
Formål: sikre at alle enheder starter i korrekt rækkefølge og at Home Assistant
kan forbinde til alle integrationer ved opstart.
---
## NEDLUKNING
Luk i denne rækkefølge — afhængige enheder lukkes **før** infrastruktur.
1. Luk NAS (Synology) ned via DSM eller SSH
2. Sluk Sonos-enheder i alle rum og tag stikket ud
3. Sluk PlayStation 5
4. Sluk printer og Sonos S1 på kontakten
5. Luk Mac mini og gamer-PC ned
6. Sluk Ubiquiti Access Points (kontor og stue)
7. Sluk Roth Touchline controller
8. Sluk gardin-controller (Hunter Douglas hub)
9. Sluk Denon forstærker
10. Sluk Google Nest Mini
11. Sluk Netatmo central enhed
12. Sluk Hue bridge
13. Sluk Ubiquiti switch
14. Sluk router
15. Sluk bredbåndsmodem (fiber)
---
## OPSTART
Start i denne rækkefølge — infrastruktur **før** afhængige enheder.
### Netværk (fundament)
1. **Bredbåndsmodem** — vent **5 min** til synkronisering
2. **Router** — vent **5 min**
3. **Ubiquiti switch** — vent **2 min**
4. **Ubiquiti Access Points** (stue og kontor) — vent **2 min**
### Enheder HA afhænger af ved opstart — tænd ALLE før NAS
5. **Hue bridge**
6. **Roth Touchline controller**
7. **Gardin-controller** (Hunter Douglas hub)
8. **Netatmo central enhed**
9. **Sonos Port** (central Sonos-enhed i stuen) — vent til den er online
10. **Sonos-enheder** — tænd én ad gangen, startende tættest på Sonos Port
11. **Denon receiver**
12. **Google Nest Mini** *(smart speaker/Google Assistant)*
13. **Printer og Sonos S1**
### NAS og Home Assistant
14. **NAS (Synology)** — tænd og vent **10 min**
- Home Assistant Docker-container starter automatisk
- HA bruger 35 min på at initialisere alle integrationer
- Tjek at HA er oppe: åbn `http://homeassistant.local:8123`
### Verificer Home Assistant
15. Tjek HA-loggen for fejl:
- Gå til **Indstillinger → System → Log** i HA
- Forventede (acceptable) fejl ved opstart:
- `husqvarna_automower_ble` — plæneklipper ikke i paringstilstand (normalt)
- `cover.terrasse_dor` / `cover.hojre` — Hunter Douglas timing (forsvinder efter et par min)
- `light.spejl1`, `light.spejl2` — kun tilgængelige når manuel kontakt er tændt
- Fejl der **kræver handling**:
- `Can not write request body for https://10.0.0.154` → Hue bridge reagerer ikke, genstartden igen
- `touchline` timeout hvert minut → Touchline CGI API stadig nede, prøv genstart af Touchline
### Øvrige enheder (ikke styret af HA)
16. **Mac mini, PS5, gamer-PC**
---
## KENDTE PROBLEMER OG STATUS (maj 2026)
| Integration | Problem | Løsning |
|---|---|---|
| Roth Touchline | CGI API (`/cgi-bin/ILRReadValues.cgi`) returnerer HTTP 000 | Netværksgenstart hjælper typisk |
| Hue bridge (10.0.0.154) | "Can not write request body" ved RAM-udtømning | HA-restart eller Hue-genstart |
| Zigbee USB | Periodisk `NcpFailure: ERROR_EXCEEDED_MAXIMUM_ACK_TIMEOUT_COUNT` | Acceptabelt, genoprettes automatisk |
| RAM | 3.7 GiB total — RAM-opgradering bestilt | Installer ny RAM når den ankommer |
---
*Opdateret: maj 2026*
+173
View File
@@ -0,0 +1,173 @@
# Ønskeliste Nyt udstyr til Home Assistant
*Sidst opdateret: maj 2026*
---
## Netværk / UniFi
### IoT VLAN-segmentering (trin 4 fra UniFi check 10. maj 2026)
**Formål:** Isolere IoT-enheder fra primært hjemmenetværk af sikkerhedshensyn.
**Plan:**
- Nyt netværk: `IoT` med VLAN 20, subnet `192.168.20.0/24`
- Genaktivér eksisterende `sonoff`-SSID og tilknyt til IoT-netværk
- Firewall-regler:
- IoT → LAN: **BLOKERET**
- Home Assistant → IoT: **TILLADT** (nødvendigt for styring)
- IoT → Internet: **TILLADT**
- Enheder der skal flyttes til IoT-netværk: Sonoff, Zaptec, Tesla-lader, Wavin, øvrige IoT
**Kræver:** Manuel re-tilslutning af WiFi-enheder til nyt SSID. Kablede enheder tildeles VLAN via switch-port.
---
## Høj prioritet
### Zigbee Termostater 1× Danfoss Ally TRV
| Antal | Rum | Beskrivelse | Status |
|---|---|---|---|
| 1 | Badeværelse | Danfoss Ally TRV (Zigbee) | ✅ Monteret og online (7. maj 2026) |
**Bekræftet ventiltype:** Danfoss RA (snap-on clips) Ally passer direkte med medfølgende RA-adapter.
**Bemærkninger:**
- Eksisterende klimastyring: kontor, soveværelse, Andreas, Daniel, lille bad (gulvvarme)
- Stue: har i dag en eQ-3 Bluetooth-termostat som IKKE virker med HA (kræver PIN, forsøgt med M5Stack proxy uden held) erstattes af Ally
- Badeværelse: har i dag en manuel Danfoss RA 2000 erstattes af Ally
- Begge ventiler er bekræftet Danfoss RA snap-on Ally passer direkte
- Badeværelse: snæver plads mod væg, men Ally (Ø52 mm) er kun 2 mm bredere end nuværende (Ø50 mm) passer fint da den ikke skal drejes
- Rigeligt plads opad (længde ~97 mm vs. nuværende ~65 mm er OK)
- Kan integreres med eksisterende vindues-sensorer til automatisk lukning ved åbent vindue
---
### Zigbee relæmoduler 4× Sonoff ZBMINI-L2
| Antal | Rum | Beskrivelse | Status |
|---|---|---|---|
| 1 | Bryggers | Sonoff ZBMINI-L2 (on/off, ingen nulleder krævet) | ⬜ Ønsket |
| 1 | Lille badeværelse | Sonoff ZBMINI-L2 (on/off, ingen nulleder krævet) | ⬜ Ønsket |
| 1 | Køkken | Sonoff ZBMINI-L2 eller tilsvarende mini-relæ til Sonos-stikkontakt | ⬜ Ønsket |
| 1 | Soveværelse | Sonoff ZBMINI-L2 eller tilsvarende mini-relæ til Sonos-stikkontakt | ⬜ Ønsket |
**Bemærkninger:**
- Monteres bag eksisterende kontakt lampen bliver smart via Zigbee, kontakten virker stadig fysisk
- Bryggers: 1× LED-loftlampe simpel on/off
- Lille bad: G9 halogen on/off (overvej at skifte G9 halogen til G9 LED for energibesparelse)
- Køkken + soveværelse: relevant hvis Sonos-højttalerne ikke har fysisk plads til smart plug
- De viste LK FUGA-kombinationer i bryggers og lille bad ser ikke ud som oplagte steder uden først at åbne og kontrollere pladsen
- Køb kun relæ til indbygning efter kontrol af dåsedybde, ledningsmængde og om nulleder er til stede
- Kræver plads i dåse/stikkontakt og bør kun laves, hvis installationen er egnet og lovlig at udføre
- Ca. 80-100 kr/stk
---
### Gulvvarme: Wavin bryggers + køkken Sonoff ZBMINI-L2 + temp-sensorer
| Antal | Enhed | Beskrivelse | Status |
|---|---|---|---|
| 2 | Sonoff ZBMINI-L2 | Zigbee relæ, erstatter Wavin RF-modtager | ⬜ Ønsket |
| 2 | SONOFF SNZB-02D | Zigbee temperatur/fugt sensor | ⬜ Ønsket |
**Baggrund:** Bryggers og køkken har i dag en dumb Wavin RF-modtager (JT6/3003-boksen) med to relækanaler (X = bryggers, Y = køkken) der styres af simple trådløse Wavin-termostater. Ingen smart protokol.
**Plan:** ZBMINI-L2 sættes i serie med fasen ud til aktuatoren (kanalernes brune ledning ud) inde i Wavin-boksen. Temp-sensor per rum. HA `generic_thermostat` samler dem til climate-entiteter der integreres med `script.varme_recalculate` som de øvrige rum.
**Se:** `dokumenter/wavin_sonoff_installation.md` for komplet installationsguide.
**Pris:** ~260 kr (ZBMINI) + ~200 kr (temp-sensorer) = **~460 kr total**
---
## Normal prioritet
### Vindues-/dørsensorer Aqara
| Antal | Placering | Beskrivelse | Status |
|---|---|---|---|
| 4 | Køkken | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
| 2 | Bryggers | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
| 4 | Forgang | Aqara kontaktsensor (vindue/dør) | ⬜ Ønsket |
| 2 | Stue | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
| 1 | Fordør | Aqara kontaktsensor (dør) | ⬜ Ønsket |
| 1 | Bagdør | Aqara kontaktsensor (dør) | ⬜ Ønsket |
| 1 | Kontor | Aqara kontaktsensor (vindue) | ⬜ Ønsket |
**Total:** 15 stk. Aqara Door & Window Sensor (Zigbee) — 6 eksisterende + 9 nye
**Formål:** Automatisk stop af gulvvarme i rum med åbent vindue — samme logik som eksisterende sensorer i Andreas, Daniel, Soveværelse og Lille bad. Kobles direkte ind i `script.varme_recalculate` med if-betingelse per rum.
**Bemærk:** Afklar præcis placering (vinduesramme vs. dørfals) inden køb, særligt forgang og fordør/bagdør.
---
### Mere RAM til Synology NAS
| Antal | Beskrivelse | Status |
|---|---|---|
| 1 stk | Crucial 16GB DDR4-2666 SODIMM — CT16G4SFD8266 | ✅ Installeret 13. maj 2026 |
**Baggrund:** OOM-kill (exit 137) 23. april 2026 — Synology løb tør for RAM og dræbte mosquitto, gitea, gitea-db og DokuWiki på samme tid. HA selv overlevede men crashede urent.
**Resultat:** DS920+ kører nu med 4GB (loddet) + 16GB SODIMM = **20GB total RAM**. Bekræftet i DSM Info Center. Sundhedscheck 13. maj 2026: 3,4GB brugt af 19GB tilgængeligt, swap-brug 0B — ingen memory-pressure. Alle 8 Docker containere kører healthy.
---
### Idéer til fremtidige udvidelser
| Enhed | Beskrivelse | Bemærkninger |
|---|---|---|
| Zigbee vandlækagesensor | Vandskadedetektion | Under opvaskemaskine, vaskemaskine, badeværelse |
| Zigbee vibrationssensor | Registrér vaskemaskine-status | Ligesom opvaskemaskinen, men for vaskemaskinen |
| Smart dørklokke | Video-dørklokke | Integreres med HA notifikationer |
| Zigbee knapmodul | Fysisk betjening | Erstat eksisterende Hue-switches med Zigbee2MQTT-kompatible |
| Relæ i stikkontakt til spejllys | Smart styring af `light.spejl1` + `light.spejl2` via eksisterende manuel stikkontakt | Familien bruger den manuelle kontakt i dag, så løsningen skal bevare fysisk betjening |
---
## Lav prioritet / Nice-to-have
| Enhed | Beskrivelse | Bemærkninger |
|---|---|---|
| Køkken: 11× Hue GU10 White Ambiance | Smart spots til køkken (4+7 grupper) | Bekræftet GU10-fatning. Kræver bypass af eksisterende dimmer. Ca. 2.200 kr |
| Postkasse-sensorer | 2× Aqara kontaktsensor + 1× Aqara vibrationssensor | Vippelåg, brevsprække, tømmeluge metal-kasse dæmper Zigbee, kræver nærliggende router |
| Luftkvalitetssensor | VOC / PM2.5 | Udvidelse af eksisterende CO₂-måling |
| Energimåler (CT-clamp) | Realtids strømmåling pr. kredsløb | Supplement til Eloverblik |
---
## Vildtkamera
**Krav:**
- Batteri-drevet (ingen strøm på placeringen)
- WiFi-upload — ingen SD-kortafhentning
- Integration med Home Assistant og/eller Synology NAS
**Valgt: Reolink Argus 4 Pro + Reolink solpanel**
- Batteri + solpanel → aldrig behov for genopladning
- WiFi 6 — upload direkte til NAS/cloud uden SD-kort
- Officiel HA-integration (bevægelses-`binary_sensor` + `camera`-entitet med live stream og snapshot)
- Virker med Synology Surveillance Station via RTSP
- Farve-natvisning (spotlight)
| Enhed | Antal | Status |
|---|---|---|
| Reolink Argus 4 Pro | 1 | ⬜ Ønsket |
| Reolink solpanel (kompatibelt) | 1 | ⬜ Ønsket |
---
## Indkøbt ✅
*Flyt enheder hertil når de er købt og installeret.*
| Dato | Enhed | Antal | Bemærkninger |
|---|---|---|---|
| April 2026 | Nous A1Z Smart Plug (Zigbee, energimåling) | 8 | Til Sonos + mesh-udvidelse |
| April 2026 | Danfoss Ally TRV (Zigbee) | 1 | Stue installeret |
+289
View File
@@ -0,0 +1,289 @@
# Udstyr tilsluttet Home Assistant
*Sidst opdateret: april 2026*
---
## Netværk & Infrastruktur
| Enhed | Placering | Bemærkninger |
|---|---|---|
| Synology NAS | Serverrum | IP: 10.0.0.142, 4-bay, kører HA i Docker |
| Zigbee USB-dongle | NAS (USB) | `/dev/ttyUSB0` Zigbee koordinator |
| Philips Hue Bridge | — | IP: 10.0.0.154 |
| UniFi netværk | Hele huset | Bruges til enhedsblokeringer (børnenes TV/PS5) |
| Duck DNS | Ekstern | anneclaus.duckdns.org |
---
## Lys (~50+ individuelle)
### Philips Hue
| Rum | Enheder |
|---|---|
| Stue | `raket`, `pendle1`, `pendle2`, `panton`, `spisebord`, `syd` |
| Gang | `gang`, `fordelingsgang_1` `fordelingsgang_5` |
| Forgang | `forgang` |
| Soveværelse | `claus`, `anne`, `sov_dor`, `sov_midt`, `sov_vindue` |
| Kontor | `kontor` |
| Badeværelse | `bad_nw`, `bad_ne`, `bad_sw`, `bad_se`, `spejl1`, `spejl2` |
| Daniels værelse | `daniel_lysstrip`, `bamse` |
| Andreas' værelse | `andreas_lysstrip`, `andreas_stol` |
| Sauna | `sauna` |
| Garage | `garage` |
| Udendørs | `indkorsel_plug`, `udendors_forgang`, `indkorsel_2`, `fordoer` |
| Havelys | `hue_outdoor_spot_1`, `hue_outdoor_spot_2`, `hue_outdoor_spot_3` |
| Diverse | `hue_ambiance_lamp_1` `1_3`, `hue_ambiance_lamp_2`, lysstrips |
### Sonoff (WiFi)
| Enhed | Placering |
|---|---|
| `sonoff_10006a2cdd` | Koste |
| `sonoff_1000a76e41` | Drivhus |
| `sonoff_1000a8c28a_2` | Rønnebær |
| `sonoff_1000a721a1` | Terrasse |
| `sonoff_1000a70ca0` | Ventilator/Paradis |
### Smart Plugs (Zigbee)
| Enhed | Model | Placering |
|---|---|---|
| Nous A1Z #1-#4 | Nous A1Z (Zigbee 3.0) | Diverse |
| `on_off_plug_1` | Hue On/Off Plug | Udetræ |
| `on_off_plug_2` | Hue On/Off Plug | Udetræ |
### Lysgrupper (16 grupper)
`lys_stue`, `lys_gang`, `lys_pendle`, `lys_bad`, `lys_kids`, `lys_indenfor`, `lys_udenfor`, `lys_indkorsel`, `lys_havelys`, `lys_drivhus`, `lys_ronnebær`, `lys_koste`, `lys_terasse`, `lys_paradis`, `lys_udetrae`, `lys_julelys`
---
## Medieafspillere
### Sonos (10 enheder)
| Enhed | Rum |
|---|---|
| `media_player.stue` | Stue |
| `media_player.stue_2` | Stue (alternativ) |
| `media_player.kokken` | Køkken |
| `media_player.alrum` | Alrum |
| `media_player.sovevaerelse` | Soveværelse |
| `media_player.kontor` | Kontor |
| `media_player.andreas` | Andreas' værelse |
| `media_player.daniel` | Daniels værelse |
| `media_player.badevaerelse` | Badeværelse |
| `media_player.lille_badevaerelse` | Lille badeværelse |
### Øvrige
| Enhed | Rum |
|---|---|
| Samsung S95CA 55" TV | Stue |
| Denon Receiver | Stue (IP: 10.0.0.233) |
---
## Klimastyring (Gulvvarme)
| Zone | Entity |
|---|---|
| Kontor | `climate.kontor` |
| Soveværelse | `climate.sovev_prelse` |
| Andreas' værelse | `climate.andreas` |
| Daniels værelse | `climate.daniel` |
| Lille badeværelse | `climate.lille_bad` |
---
## Bevægelsessensorer (Zigbee/Hue)
| Sensor | Placering |
|---|---|
| `stue_bevaegelse` | Stue |
| `kontor_motion_bevaegelse` | Kontor |
| `gang_sensor_motion` | Gang |
| `forgang_sensor_motion` | Forgang |
| `bad_motion_sensor_motion` | Badeværelse |
| `garage_sensor_motion` | Garage |
| `sauna_motion_motion` | Sauna |
| `hue_motion_sensor_1` | Diverse (×2) |
| `hue_motion_sensor_2` | Diverse (×2) |
---
## Vindues- & Dørsensorer (Zigbee)
### Vinduer
| Sensor | Placering |
|---|---|
| `andreas_vindue` | Andreas' værelse |
| `daniel_vindue` | Daniels værelse |
| `sovevaerelse_vindue` | Soveværelse |
| `badevaerelse_vindue` | Badeværelse |
| `lille_bad_vindue` | Lille badeværelse |
| `terrassedor` | Terrassedør |
### Døre
| Sensor | Placering |
|---|---|
| `garageport` | Garage |
| `dishwasher_dor` | Opvaskemaskine |
---
## Gardiner / Covers (Zigbee)
| Enhed | Placering |
|---|---|
| `cover.hojre` | Stue (højre) |
| `cover.midt` | Stue (midt) |
| `cover.syd` | Stue (syd) |
| `cover.venstre` | Stue (venstre) |
| `cover.terrasse_dor` | Terrassedør |
| `cover.anne` | Garage (Annes side) |
---
## Miljøsensorer
### CO₂
| Sensor | Placering |
|---|---|
| `sovevaerelse_stue_carbon_dioxide` | Soveværelse/stue |
| `sovevaerelse_daniel_carbon_dioxide` | Daniels værelse |
| `sovevaerelse_carbon_dioxide` | Soveværelse |
### Luftfugtighed
| Sensor | Placering |
|---|---|
| `sovevaerelse_stue_luftfugtighed` | Soveværelse/stue |
| `sovevaerelse_daniel_luftfugtighed` | Daniels værelse |
| `sovevaerelse_luftfugtighed` | Soveværelse |
### Lysstyrke
| Sensor | Placering |
|---|---|
| `stue_belysningsstyrke` | Stue |
| `kontor_belysningsstyrke` | Kontor |
| `indkorsel_sensor_illuminance` | Indkørsel |
| `stue_motion_belysningsstyrke` | Stue (motion sensor) |
---
## Robotstøvsuger & Robotplæneklipper
| Enhed | Model | Bemærkninger |
|---|---|---|
| `vacuum.roborock_s8_pro_ultra` | Roborock S8 Pro Ultra | Fuld integration med rumspecifik rengøring |
| `lawn_mower.husqvarna_automower` | Husqvarna Automower | Robotplæneklipper |
---
## Tesla (SnowyWhite)
| Type | Entity |
|---|---|
| Batteri | `sensor.snowywhite_battery` |
| Rækkevidde | `sensor.snowywhite_range` |
| Opladning | `sensor.snowywhite_charger_power`, `binary_sensor.snowywhite_charging` |
| Dæktryk | 4× TPMS sensorer |
| Position | `device_tracker.snowywhite_location_tracker` |
---
## Opvaskemaskine (Bosch/Siemens Home Connect)
| Entity | Beskrivelse |
|---|---|
| `sensor.dishwasher_status_2` | Status (off/running/paused) |
| `sensor.dishwasher_remaining_time_2` | Resterende tid |
| `sensor.dishwasher_powerdisk_level` | Opvaskepulver |
| `sensor.dishwasher_salt_level` | Salt |
| `sensor.dishwasher_rinse_aid_level` | Afspændingsmiddel |
| `button.dishwasher_start` | Start |
---
## EV-Ladning
| Integration | Beskrivelse |
|---|---|
| Zaptec | EV-lader |
| EV Smart Charging | Optimeret opladning efter elpris |
---
## Energi & Forsyning
| Integration | Beskrivelse |
|---|---|
| Eloverblik | Dansk elforbrug (datahub) |
| Energi Data Service | Realtids-elpriser |
| Affald DK | Affaldsafhentning (rest, papir/plast, haveaffald) |
---
## Netværksblokering (UniFi)
| Switch | Enhed |
|---|---|
| `switch.localhost` | Daniels TV |
| `switch.localhost_2` | Andreas' TV |
| `switch.unifi_block_5c_96_66_25_36_b7` | Andreas' PS5 |
| `switch.unifi_block_5c_96_66_39_18_4a` | Daniels PS5 |
| `switch.andreas_atv` | Andreas' Apple TV |
---
## Personsporing
| Person | Enhed |
|---|---|
| Claus Dethlefsen | iPhone 15 Pro |
| Anne Schusler Dethlefsen | iPhone 14 Pro |
| Andreas Schusler Dethlefsen | — |
| Daniel Schusler Dethlefsen | — |
---
## Øvrige Integrationer
| Integration | Beskrivelse |
|---|---|
| Google Calendar | Kalenderintegration |
| Google TTS | Tekst-til-tale |
| Garmin Connect | Fitness-data |
| Spotify Plus | Musikstyring |
| Rejseplanen | Dansk offentlig transport |
| Mealie | Madplanlægning |
| HACS | Community add-on store |
| Browser Mod | UI-kontrol via browser |
| Presence Simulation | Simuler tilstedeværelse (ferie) |
| Scheduler | Avanceret planlægning |
---
## Opsummering
| Kategori | Antal |
|---|---|
| Lys (individuelle) | ~50+ |
| Lysgrupper | 16 |
| Sonos-højttalere | 10 |
| Bevægelsessensorer | ~11 |
| Vindues-/dørsensorer | 8 |
| Klimazoner (gulvvarme) | 5 |
| Gardiner/covers | 6 |
| CO₂-sensorer | 3 |
| Batterienheder overvåget | 40+ |
| Custom integrationer | 14 |
| Automationer | ~47 |
| Scripts | ~24 |
+338
View File
@@ -0,0 +1,338 @@
# Automatisk Vandingssystem Projektplan
*Oprettet: april 2026*
---
## Oversigt
Automatisk vanding af 3 højbede + drivhus med 3 kapillærkasser. Vandhane på nordsiden af huset, PE-rør i rende over græsplænen til højbede/drivhus. Systemet skal kunne passe sig selv i op til 3 uger (ferie) inkl. automatisk gødningstilførsel.
---
## Systemdiagram
```
Hus (nordside)
═══[Vandhane]════════════════════════
├── Y-splitter ──→ Manuel slange (bypass)
├── Hovedventil (24V AC magnetventil, NC)
├── Dosatron D25RE2 ←── 20L gødningsdunk
├── Vandfilter (130µm mesh)
├── Trykreducer (1-1.5 bar)
════ PE-rør 25mm i rende (~10m over græs) ════
┌──────────┤ Fordeler + ventilbox (nedgravet IP65)
│ │
Zone 1 Zone 2 Zone 3 Zone 4 Zone 5
Højbed 1 Højbed 2 Højbed 3 Drivhusbed Kapillærkasser
(sive) (sive) (sive) (sive) (3× flydventil)
```
---
## Komponentliste
### Controller & sensorer (OpenSprinklerShop.de)
| Komponent | Antal | Ca. pris | Formål |
|---|---|---|---|
| OpenSprinkler AC v3.4 (8 zoner, inkl. 24V transformer) | 1 | 650 kr | WiFi irrigation controller, HA integration |
| Analog Sensor Board | 1 | 225 kr | Forbind jordfugtsensorer |
| SMT50 jordfugt+temp sensorer | 4 | 900 kr | Én per jordzone (3 højbede + drivhusbed) |
| IP65 kabinet | 1 | 190 kr | Udendørs beskyttelse |
| **Subtotal** | | **~1.965 kr** | |
### Vandstyring (Vandingsspecialisten.dk / Bauhaus)
| Komponent | Antal | Ca. pris | Formål |
|---|---|---|---|
| Y-splitter m/ kugleventiler | 1 | 100 kr | Bypass til manuel slange |
| 24V AC magnetventiler (Rain Bird/Hunter 1") | 5 | 1.000 kr | Zoneventiler |
| Ventilbox/fordeler (underjordisk) | 1 | 300 kr | Samler ventiler |
| PE-rør 25mm | ~20m | 200 kr | Hovedledning i rende |
| Siveslange/drypslange (5m ruller) | 4 | 320 kr | Én per jordzone |
| Trykreducer (1-1.5 bar) | 1 | 150 kr | Nødvendigt for siveslanger |
| Vandfilter (mesh 130µm) | 1 | 100 kr | Beskytter mod tilstopning |
| PE-fittings (T-stykker, koblinger, klemringe) | diverse | 300 kr | Forgreninger |
| Mini-flydventiler (1/2" eller 1/4") | 3 | 240 kr | Selvreguler kapillærkasser |
| **Subtotal** | | **~2.710 kr** | |
### Gødningsdosering (Dosatron-forhandler / AgroWeb.dk)
| Komponent | Antal | Ca. pris | Formål |
|---|---|---|---|
| Dosatron D25RE2 (1:500-1:50) | 1 | 2.500 kr | Proportional gødningsinjektor, vandtryks-drevet |
| 20L dunk med låg + slangekoblinger | 1 | 100 kr | Gødningskoncentrat |
| **Subtotal** | | **~2.600 kr** | |
### Total
| Kategori | Pris |
|---|---|
| Controller & sensorer | ~1.965 kr |
| Vandstyring | ~2.710 kr |
| Gødningsdosering | ~2.600 kr |
| **Total** | **~7.275 kr** |
> **Budget-alternativ (~3.500 kr):** Venturi-injektor (200 kr) i stedet for Dosatron, billigere ventiler fra AliExpress, Tuya Zigbee jordfugtsensorer (~100 kr/stk) i stedet for SMT50.
---
## Indkøbssteder
| Butik | Hvad | Link |
|---|---|---|
| OpenSprinklerShop.de | Controller, sensorer, kabinet | opensprinklershop.de/en |
| Vandingsspecialisten.dk / Bauhaus.dk | Slanger, ventiler, rør, fittings | vandingsspecialisten.dk |
| Dosatron-forhandler / AgroWeb.dk | Gødningsinjektor | agroweb.dk |
| AliExpress (budget-alt.) | Ventiler, venturi, Tuya-sensorer | aliexpress.com |
---
## HA-integration
### OpenSprinkler HA-integration
- Officiel HA-integration (config flow)
- Giver entities for hver zone (switch), programstyring, sensordata
- Understøtter MQTT til sensor-publicering
### Automation-logik
```yaml
# Pseudo-logik for daglig vanding
trigger:
- platform: time
at: "06:00:00"
condition:
- condition: numeric_state
entity_id: sensor.netatmo_regn_sidste_24t
below: 5 # mm
- condition: numeric_state
entity_id: sensor.jordfugt_zone_1
below: 40 # procent
action:
# Sekventiel vanding (én zone ad gangen for at holde trykket)
- service: switch.turn_on
entity_id: switch.opensprinkler_zone_1
- delay: "00:15:00"
- service: switch.turn_off
entity_id: switch.opensprinkler_zone_1
- service: switch.turn_on
entity_id: switch.opensprinkler_zone_2
# ... osv for zone 3, 4 og 5
```
### Tilstandsstyring
| Hændelse | Aktion |
|---|---|
| Jordfugt < tærskel OG ingen regn | Vand zonen |
| Regn > 5mm sidste 24t | Spring vanding over |
| Temperatur < 5°C | Ingen vanding (frostbeskyttelse) |
| Kapillærkasser | Flydventiler er selvregulerende zone 5 åbnes 2×/dag |
---
## Fysisk installation trin
1. **Montér ved vandhane:** Y-splitter → hovedventil → Dosatron → filter → trykreducer
2. **Grav rende:** ~10cm dyb fra vandhane over græsplæne til højbedsområdet
3. **Læg PE-rør** i renden, dæk til
4. **Monter ventilbox** ved højbedene (nedgravet IP65 boks med 5 magnetventiler)
5. **Fordel siveslanger:** Én per højbed, én i drivhusbed
6. **Kapillærkasser:** Forbind zone 5 → T-stykker → 3× flydventil i kasserne
7. **Monter OpenSprinkler** i IP65 kabinet ved stikkontakt (nordsiden)
8. **Træk kabel** fra OpenSprinkler til ventilbox (24V AC, lavspænding)
9. **Forbind jordfugtsensorer** til Analog Sensor Board (kabel i rende)
10. **Test:** Kør hver zone manuelt, tjek flow og dækning
11. **HA-integration:** Tilføj OpenSprinkler, opret automationer
---
## 3-ugers autonomi tjekliste
- [x] Dosatron: 20L koncentrat ved 1:100 = 2.000L vandvolumen (rigeligt)
- [ ] Jordfugtsensorer forhindrer overvanding
- [ ] Netatmo regnmåler springer vanding over ved regn
- [ ] Flydventiler i kapillærkasser er 100% selvregulerende
- [ ] OpenSprinkler har lokal fallback hvis HA er nede
- [ ] Rens vandfilter inden afrejse
- [ ] Test alle zoner inden afrejse
---
## Eksisterende sensorer der kan bruges
- **Netatmo regnmåler** allerede installeret, bruges til vejrkompensering
- **WiFi-dækning** god dækning til drivhus/have (bekræftet)
- **Zigbee-dækning** god, udvides yderligere med Zigbee smart plugs (se ønskeliste)
---
## Konkret graveplan & placering (ud fra fotos)
### Vandhane-station (nordsiden af huset)
```
[Vindue]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
│ Husmur │
│ │
│ [Slangerulle] [Stikkontakt - sort boks] │
│ Gardena │ │
│ │ │ 230V │
│ │ ┌────┴─────────┐ │
│ ▼ │ OpenSprinkler│ │
│ [Vandhane] │ i IP65 boks │ │
│ │ └────┬─────────┘ │
│ ●─[Y-splitter] │ │
│ │ ├── Manuel slange (bypass) │ 24V kabel │
│ │ └── ↓ │ (parallelt med │
│ │ [Hovedventil 24V] │ PE-rør) │
│ │ [Dosatron + 20L dunk] │ │
│ │ [Filter] │ │
│ │ [Trykreducer] │ │
│ ▼ │ │
│ ●═════════════════════════════ ●═══════════════════►
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Fliser → græsplæne
Husqvarna Automower kører her
→ PE-rør graves ned ~10cm under græs
```
### Renden over græsplænen
```
[Hus med vandhane]
═══════════════════════════════════
│ PE-rør 25mm + 24V kabel
│ (i samme rende, ~10cm dyb)
│ (~6-8m over græsplæne)
│ ⚠ Husqvarna Automower kører her
│ derfor SKAL alt graves ned
┌───────────────────────────────────────┐
│ Graverende stopper │
│ mellem højbedene │
│ │
[Højbed 1] ⊕──── ventilbox [Højbed 2]
(asparges) │ graves ned (asparges)
│ i grus-stien
│ ┌──────────┐
│ │ Ventilbox │ ← 5 magnetventiler
│ │ (IP65) │ (3 til højbede + 1 til drivhusbed + 1 til kapillærkasser)
│ └──────────┘
[Højbed 3] │
(rabarber) │
PE-rør fortsætter
under drivhusets fundament
(lille graverende eller eksisterende åbning)
[Op gennem flise inde i drivhus]
```
### Højbede set ovenfra (fra fotos)
```
═══[Hus, nordside]═══
│ PE-rør i rende (under græs)
┌──────────────────────────┐
│ Højbed 1 (asparges) │ ← sive 5m
│ ━━━━━━━━━━━━━━━━━━━━━━━━ │ (zone 1)
└──────────┬───────────────┘
╔══════╪══════╗
║ ⊕ Ventilbox ║ ← graves ned i grus-stien
║ (5 ventiler)║
╚══════╪══════╝
┌──────────┴──────────┐──────────────────┐
│ Højbed 2 (asparges) │ Højbed 3 (rabarb)│
│ ━━━━━━━ sive 5m ━━━ │ ━━━ sive 5m ━━━━ │
│ (zone 2) │ (zone 3) │
└──────────┬──────────┴──────────────────┘
│ PE-rør under drivhusfundament
┌──────────────────────────────────┐
│ Drivhus │
│ 📍 ↑ PE-rør op gennem flise │
│ │ │
│ ├──→ Sive 5m i drivhusbed │ ← (zone 4)
│ │ │
│ └──→ Zone 5 ─────┐ │
│ │ │
│ ┌─────────────────┴─────────┐ │
│ │ Mini-flydventil → Kasse 1│ │
│ │ Mini-flydventil → Kasse 2│ │
│ │ Mini-flydventil → Kasse 3│ │
│ └───────────────────────────┘ │
└──────────────────────────────────┘
```
### Drivhus kapillærkasser (fra foto: 3 sorte kasser med huller)
```
┌────────────────────────────────────────────────┐
│ Drivhus (set indefra mod indgang) │
│ │
│ 📍 PE-rør op gennem flise (ved indgang) │
│ │ │
│ │ │
│ ├─────→ Zone 4: Siveslange langs jorden ─→ │
│ │ │
│ │ [Plantebord] │
│ │ ┌──────────┐ │
│ │ │ potter │ │
│ │ └──────────┘ │
│ │ │
│ │ ┌────┐ ┌────┐ ┌────┐ │
│ ├─────→ Zone 5: │ ⊙F │ │ ⊙F │ │ ⊙F │ ← Mini-flydven│
│ │ ├────┤ ├────┤ ├────┤ │
│ │ │Kap1│ │Kap2│ │Kap3│ ← Kapillær- │
│ │ │vand│ │vand│ │vand│ kasser med │
│ │ └────┘ └────┘ └────┘ vandreservoir│
│ │ │
│ │ Selvregulerer: når vandstand falder, │
│ │ åbner flydventilen og fylder op │
│ │
└────────────────────────────────────────────────┘
```
### Strækninger & graveplan (sammenfatning)
| Strækning | Længde | Hvad |
|---|---|---|
| Vandhane → start på græsrende | ~2m | PE-rør + 24V kabel langs husmur |
| Rende over græsplæne | ~6-8m | Graveret ~10cm dyb (Husqvarna kører her) |
| Rende → ventilbox (mellem højbede) | ~1-2m | Ventilbox nedgraves i grus-sti |
| Ventilbox → drivhus | ~3m | Under drivhusfundament |
| Inde i drivhus | ~2m | Op ved flise, fordel til drivhusbed + 3 kapillærkasser |
| **Total PE-rør** | **~15m** | (køb 20m for sikkerhed) |
### Vigtige observationer fra fotos
1. **Husqvarna Automower** har sin garage ved nordmuren PE-rør og kabler SKAL graves ned så robotten kan køre uforstyrret over græsset
2. **Stikkontakten** under vinduet er ideel placering for OpenSprinkler ingen lange strømkabler nødvendige
3. **Grus-stien mellem 1. og 2./3. højbed** giver naturligt sted til ventilboxen let adgang for service, ingen planter forstyrres
4. **Drivhusets fundament** PE-rør føres under (kort gravearbejde) og kommer op ved flisen ved indgangen
5. **Slangerullen** kan blive ved muren til manuel brug Y-splitteren bevarer manuel adgang
6. **Stikkontakten** sidder højt nok til at være fri af regnvand
@@ -0,0 +1,509 @@
# Alternativt Vandingssystem Rain Bird RC2 + Venturi + Kapillærkasser
*Oprettet: april 2026*
---
## Formål
Dette dokument beskriver et alternativ til det eksisterende forslag i [vandingssystem.md](./vandingssystem.md).
Dette alternative forslag tager udgangspunkt i:
- Rain Bird RC2 230V Outdoor som primær controller
- 5 zoner i stedet for 4
- Venturi-gødskning i stedet for Dosatron
- 3 kapillærkasser i drivhus med mekaniske flydventiler uden zone-styring
- Lokal autonom drift, selv hvis Home Assistant er utilgængelig
Målet er en løsning, der er lidt mere klassisk "havevanding" end OpenSprinkler-forslaget, men stadig kan overvåges og delvist styres fra Home Assistant.
---
## Kort konklusion
Dette Rain Bird-forslag er stærkt, hvis du vil have:
- en traditionel irrigation-controller med egen lokal tidsplan
- 5 tydeligt adskilte zoner
- lavere kompleksitet på gødningsdelen
- et system der fortsætter med at køre uden Home Assistant
Det oprindelige OpenSprinkler-forslag er stærkere, hvis du vil have:
- dybere Home Assistant-integration
- mere fleksibel logik omkring jordfugt, regn og feriedrift
- bedre mulighed for sensorstyret beslutningstagning direkte i controller/logik
- mere præcis og stabil gødningsdosering via Dosatron
---
## Systemoversigt
### Have-layout
- 3 højbede á 2m × 1m
- 1 ekstra bed
- 1 drivhus på 3m × 3m
- 3 kapillærkasser inde i drivhuset
- Vandhane på husmur
- 230V ved vandhane
- WiFi via UniFi i nærheden
- Nedgravet 25 mm PE-rør, ca. 20-30 cm dybde
### Afstande
- Ca. 5 m fra husmur/vandhane til første højbed
- Højbede står på række
- Ca. 70 cm mellem højbedene
- Ca. 4 m fra højbedene til drivhuset
### Zoner
| Zone | Område | Vandingstype |
|---|---|---|
| Zone 1 | Højbed 1 | 16 mm drypslange / driptubing |
| Zone 2 | Højbed 2 | 16 mm drypslange / driptubing |
| Zone 3 | Højbed 3 | 16 mm drypslange / driptubing |
| Zone 4 | Ekstra bed | 16 mm drypslange / driptubing |
| Zone 5 | Drivhusbed | Mikro-dryp |
### Kapillærkasser
Kapillærkasserne er **ikke zone-styrede**.
De forsynes fra en separat, konstant trykreduceret lavtryksgren med:
- mekanisk flydventil i hver kasse
- fast vandstand på ca. 2 cm
- overflow-beskyttelse
- manuel afspærring før kapillærgrenen
Det betyder, at kapillærkasserne virker, også hvis controlleren eller Home Assistant er nede.
---
## Fysisk systemdesign
### Hovedopbygning
```text
Husmur / vandhane
Vandhane
├── Y-splitter
│ ├── Manuel haveslange
│ └── Irrigationssystem
└── Filter 120 mesh
├── Trykreducer til drypzoner
│ │
│ ├── Venturi-bypass + gødningstank
│ │ │
│ │ └── 25 mm PE hovedledning til ventilbox
│ │ │
│ │ ├── Ventil 1 → Højbed 1
│ │ ├── Ventil 2 → Højbed 2
│ │ ├── Ventil 3 → Højbed 3
│ │ ├── Ventil 4 → Ekstra bed
│ │ └── Ventil 5 → Drivhus dryp
│ │
│ └── 24VAC styret af Rain Bird RC2
└── Separat lavtryksgren til kapillærkasser
├── Egen regulator
├── Manuel afspærring
└── 16 mm forsyning til 3 flydventiler i drivhus
```
### Bemærkning om gødning og kapillærkasser
Hvis kapillærkasserne **ikke** skal have gødning kontinuerligt, bør deres vandgren ligge **uden om venturi-injektoren**.
Det er min anbefaling i denne løsning.
Det giver:
- mindre risiko for salt-/næringsophobning i reservoirerne
- mindre risiko ved 3 ugers ferie
- enklere drift
Hvis du ønsker gødning i kapillærkasserne, bør det ske meget kontrolleret og ikke som konstant forsyning.
---
## Anbefalet hardware
### Controller
| Komponent | Antal | Estimat | Note |
|---|---|---|---|
| Rain Bird RC2 230V Outdoor | 1 | ca. 1.400-1.900 kr | 8 stationer, WiFi, 24VAC |
### Ventiler og hydraulik
| Komponent | Antal | Estimat | Note |
|---|---|---|---|
| Rain Bird 100-DV 1" magnetventil | 5 | ca. 1.000-1.250 kr | 1 per zone |
| Ventilbox | 1 | ca. 300-500 kr | Samlet servicepunkt |
| PE-rør 25 mm | 15-20 m | ca. 200-300 kr | Nedgravet hovedledning |
| 16 mm driptubing | passende længde | ca. 500-900 kr | Bed- og drivhusfordeling |
| 120 mesh filter | 1 | ca. 100-200 kr | Før alt dryp |
| Trykreducer til drypsystem | 1 | ca. 150-250 kr | Stabilt dryktryk |
| Ekstra regulator til kapillærgren | 1 | ca. 150-250 kr | Lavt tryk til flydventiler |
| Kugleventiler / afspærringer | flere | ca. 150-300 kr | Service og bypass |
| Fittings og koblinger | diverse | ca. 300-500 kr | PE + 16 mm |
### Gødningssystem
| Komponent | Antal | Estimat | Note |
|---|---|---|---|
| Venturi-injektor | 1 | ca. 150-400 kr | Billigere end Dosatron |
| Bypass-loop med ventiler | 1 | ca. 200-400 kr | Justering af sug |
| Gødningstank 20L | 1 | ca. 100-200 kr | Koncentrat |
| Sugeslange + filter | 1 | ca. 50-100 kr | Til venturi |
### Drivhus / kapillærkasser
| Komponent | Antal | Estimat | Note |
|---|---|---|---|
| Flydventil til kapillærkasser | 3 | ca. 240-450 kr | Mekanisk vandstand |
| Overflow-løsning | 3 | ca. 100-200 kr | Sikkerhed |
| 16 mm + mikrofordeling | 1 sæt | ca. 150-250 kr | Til drivhus |
### Sensorer
| Komponent | Antal | Estimat | Note |
|---|---|---|---|
| Jordfugtsensor højbed | 1-2 | afhænger af model | Til HA beslutningsstøtte |
| Jordfugtsensor drivhus | 1 | afhænger af model | Til zone 5 |
| Netatmo regnmåler | eksisterer | 0 kr | Allerede installeret |
### Samlet budget
Praktisk realistisk budget:
- **ca. 4.500-6.500 kr** uden avanceret flowmåler
- **ca. 5.500-7.500 kr** hvis du vælger bedre fittings, bedre sensorer og ekstra sikkerhedskomponenter
Det gør løsningen typisk lidt billigere end OpenSprinkler + Dosatron-forslaget, især fordi venturi er langt billigere end Dosatron.
---
## Driftsprincip
### Når Home Assistant virker
Home Assistant bruges til:
- overvågning af zoner
- regnlogik
- jordfugt-logik
- notifikationer
- manuel override
- statistik og status
### Når Home Assistant er nede
Rain Bird RC2 skal stadig kunne:
- køre faste schedules
- vande alle 5 zoner efter lokal tidsplan
- ignorere HA-afhængighed
Kapillærkasserne virker stadig via mekaniske flydventiler.
Det betyder, at feriekravet på 3 uger kan opfyldes, **hvis de faste schedules er fornuftigt sat op i controlleren**.
---
## Home Assistant-integration
### Vigtig kompatibilitetsnote
Home Assistant har en Rain Bird integration til LNK WiFi-baserede systemer.
Det er en fordel for denne løsning, men der er også en vigtig begrænsning:
- HA-dokumentationen angiver, at **Rain Bird 2.0 app / nyere IQ4-migrering ikke er kompatibel med Home Assistant**
- derfor bør du sikre dig, at den valgte controller/app-kombination stadig fungerer med den lokale HA-integration
Hvis RC2-enheden eller firmware ender på den nye inkompatible platform, bliver denne løsning markant dårligere ift. HA-integration.
OpenSprinkler-forslaget har her lavere integrationsrisiko.
### Forventede HA-entities
```text
switch.zone_1
switch.zone_2
switch.zone_3
switch.zone_4
switch.zone_5
sensor.soil_moisture_bed
sensor.soil_moisture_greenhouse
sensor.rain_today
number.rain_delay
calendar.irrigation_schedule
```
### Praktisk model i HA
- Rain Bird styrer den basale lokale plan
- Home Assistant justerer eller stopper efter behov
- HA skal ikke være den eneste logikmotor
---
## Anbefalet autonom strategi
### Lokal controller-plan i Rain Bird
Programmer minimum følgende lokalt i Rain Bird:
- Zone 1-4: kort morgenkørsel
- Zone 5: kortere, hyppigere kørsel efter drivhusbehov
- Regnforsinkelse kan justeres fra HA eller manuelt
### HA som supervisory layer
Home Assistant skal bruges som et ekstra lag ovenpå:
- sæt rain delay ved kraftig regn
- notifikation ved lav jordfugt i drivhus
- notifikation ved manglende flow / usædvanligt forbrug hvis flowsensor tilføjes
- manuel override ved hedebølge eller ferie
---
## Eksempel på HA-automationslogik
### 1. Regn-forsinkelse baseret på Netatmo
```yaml
alias: Vanding - regnforsinkelse ved regn
trigger:
- platform: numeric_state
entity_id: sensor.rain_today
above: 5
action:
- service: number.set_value
target:
entity_id: number.rain_delay
data:
value: 1
mode: single
```
### 2. Notifikation om tørt højbed
```yaml
alias: Vanding - hoejbed tørt
trigger:
- platform: numeric_state
entity_id: sensor.soil_moisture_bed
below: 28
for: "02:00:00"
action:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Vanding"
message: "Højbedene er tørre. Overvej ekstra vanding eller længere zonetid."
mode: single
```
### 3. Notifikation om tørt drivhus
```yaml
alias: Vanding - drivhus tørt
trigger:
- platform: numeric_state
entity_id: sensor.soil_moisture_greenhouse
below: 35
for: "01:00:00"
action:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Vanding"
message: "Drivhuset er tørt. Tjek zone 5 eller hæv køretiden."
mode: single
```
### 4. Manuel zonekørsel med specifik varighed
```yaml
alias: Vanding - start zone 1 manuelt
trigger: []
action:
- service: rainbird.start_irrigation
data:
entity_id: switch.zone_1
duration: 15
mode: single
```
---
## Gødningsstrategi i dette alternativ
### Venturi-forslag
Venturi giver mening hvis du vil have:
- lavere pris
- få bevægelige dele
- enkel udskiftning
Men venturi er dårligere end Dosatron på:
- præcision
- stabil dosering ved trykvariationer
- reproducerbarhed over lang tid
### Praktisk anbefaling
Brug venturi kun på udvalgte dage eller uger, fx:
- gødning 1 gang pr. uge i vækstsæson
- manuel åbning af venturi-bypass inden ferie hvis du er sikker på blandingsforholdet
- kapillærkasser helst uden venturi i den konstante gren
### Simpel HA-logik for gødningsdag
```yaml
input_boolean:
fertigation_day:
name: Gødningsdag
alias: Vanding - gødningspåmindelse
trigger:
- platform: state
entity_id: input_boolean.fertigation_day
to: "on"
action:
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Aktivér venturi-bypass og fyld gødningstank før næste vanding."
mode: single
```
---
## Sikkerhed og fail-safe
### Minimum anbefalet
- 120 mesh filter
- trykreducer før dryp
- separat regulator til kapillærgrenen
- manuel afspærring af kapillærgren
- ventilbox med god adgang
- vintertømning/dræning
### Bør tilføjes senere
- flowsensor på hovedlinjen
- læksensor ved ventilbox eller ved husmur
- notifikation ved usædvanlig lang zonekørsel
---
## Sammenligning forslag 1 vs forslag 2
### Forslag 1: OpenSprinkler + Dosatron
Se [vandingssystem.md](./vandingssystem.md).
Kendetegn:
- OpenSprinkler AC v3.4
- 4 zoner
- SMT50-sensorer direkte ind i systemdesignet
- Dosatron proportional gødskning
- kapillærkasser koblet på drivhus-zonen
- stærk HA-orientering
### Forslag 2: Rain Bird RC2 + Venturi
Dette dokument.
Kendetegn:
- Rain Bird RC2 Outdoor
- 5 zoner
- Venturi-injektor
- kapillærkasser på konstant mekanisk gren
- mere klassisk havevanding-controller
- HA som overvågning/supervision oven på lokal controller
### Sammenligningstabel
| Punkt | Forslag 1: OpenSprinkler + Dosatron | Forslag 2: Rain Bird + Venturi |
|---|---|---|
| Controller-fleksibilitet | Meget høj | Middel |
| HA-integration | Meget stærk | God, men med kompatibilitetsrisiko på nyere Rain Bird platforme |
| Lokal autonomi uden HA | God | God |
| Sensorbaseret styring | Bedst egnet | Mulig, men mere indirekte |
| Gødningspræcision | Meget høj | Middel |
| Pris | Højere | Ofte lidt lavere |
| Antal zoner | 4 | 5 |
| Kapillærkasser | På drivhus-zone | Konstant mekanisk forsyning |
| Installationskompleksitet | Høj | Middel |
| Risiko for fejldosering | Lavere | Højere |
| Egnethed til ferie | Meget god | God, hvis den lokale schedule er veldesignet |
| Udvidelsesmuligheder | Meget høj | Middel-god |
---
## Praktisk vurdering
### Hvornår jeg ville vælge forslag 1
Vælg OpenSprinkler + Dosatron hvis du vil have:
- den mest HA-native løsning
- mest mulig kontrol og fleksibilitet
- bedre sensorstyring
- bedre gødningspræcision
- en løsning som er lettere at gøre intelligent over tid
### Hvornår jeg ville vælge forslag 2
Vælg Rain Bird + Venturi hvis du vil have:
- mere traditionel sprinklertænkning
- 5 separate zoner fra start
- simplere gødningshardware
- lidt lavere pris
- stærkere "standalone controller"-følelse
### Min samlede anbefaling
Hvis målet er **maksimal Home Assistant-værdi og bedst mulig logik**, er det oprindelige OpenSprinkler-forslag stadig det bedste.
Hvis målet er **en mere klassisk, driftssikker og lidt enklere havevanding-controller**, er dette Rain Bird-forslag et godt alternativ, men kun hvis du verificerer at den præcise Rain Bird-platform stadig er kompatibel med Home Assistant.
---
## Anbefalet beslutning
Hvis du vil vælge mellem de to, vil jeg formulere det sådan:
- **Vælg OpenSprinkler** hvis HA-integration og intelligent styring er vigtigst
- **Vælg Rain Bird** hvis lokal controllerdrift og klassisk sprinkler-setup er vigtigst
- **Behold mekaniske flydventiler** til kapillærkasser i begge scenarier
- **Overvej flowsensor** uanset hvilken løsning du vælger
---
## Næste skridt hvis du går med Rain Bird-løsningen
1. Verificér at præcis RC2/LNK-kombination er kompatibel med Home Assistant i din opsætning.
2. Beslut om kapillærkasserne skal være helt uden gødning.
3. Fastlæg drypslange-layout for hver af de 5 zoner.
4. Vælg jordfugtsensor-type og integrationsmetode.
5. Tilføj senere flowsensor som ekstra sikkerhed ved ferie.
@@ -0,0 +1,248 @@
# Beslutningsnotat Hvilket vandingssystem ville jeg vælge?
Oprettet: april 2026
Dette notat er et kort supplement til:
- [vandingssystem.md](./vandingssystem.md)
- [vandingssystem_alternativ_rainbird.md](./vandingssystem_alternativ_rainbird.md)
Formålet er at svare direkte på spørgsmålet:
**Hvis det var min have og min Home Assistant-installation, hvilken løsning ville jeg vælge?**
---
## Kort svar
Jeg ville vælge **OpenSprinkler + proportional gødskning + mekaniske flydventiler til kapillærkasser**.
Med andre ord: grundretningen fra [vandingssystem.md](./vandingssystem.md), men med én vigtig praktisk pointe:
- kapillærkasserne skal stadig være så simple og mekaniske som muligt
- flowsensor bør tilføjes senere som ekstra sikkerhed
---
## Hvorfor jeg ville vælge den løsning
### 1. Den passer bedre til din måde at bruge Home Assistant på
Du bruger allerede Home Assistant aktivt til:
- styring
- automations
- sensorer
- speciallogik
- fejlsøgning
- dokumentation og videre udvikling
Det peger klart i retning af en løsning, hvor controlleren er mere åben og mere HA-venlig.
OpenSprinkler passer bedre til den tankegang end Rain Bird.
---
### 2. Integrationsrisikoen er lavere
Rain Bird-løsningen kan være fin, men den har en reel usikkerhed:
- nyere Rain Bird-platforme og app/firmware-retninger har kendte begrænsninger ift. Home Assistant
- det betyder, at man kan ende med en controller, som fungerer fint alene, men dårligere sammen med HA end forventet
OpenSprinkler er mere forudsigelig her.
Det betyder ikke, at Rain Bird er dårlig.
Det betyder bare, at **den tekniske risiko er højere**.
---
### 3. Sensorlogik bliver mere naturlig
Dit projekt handler ikke kun om at tænde og slukke vand.
Det handler også om:
- jordfugt
- regn
- ferie i 3 uger
- drivhus
- gødning
- forskellig adfærd i forskellige zoner
Jo mere af løsningen der bygger på beslutningslogik, desto mere giver OpenSprinkler-retningen mening.
Rain Bird er bedre som klassisk controller.
OpenSprinkler er bedre som intelligent systemkomponent.
---
### 4. Dosatron er dyrere, men teknisk bedre
Hvis du vil have automatisk gødning over længere tid, er Dosatron bare en bedre løsning end venturi.
Fordelene er:
- mere stabil dosering
- mindre følsom for trykvariationer
- mere forudsigelig under ferie
- bedre egnet når du vil stole på systemet uden daglig kontrol
Venturi er attraktivt på pris, men ikke på præcision.
Hvis målet er et system du tør lade passe sig selv i 3 uger, er præcision værd at betale for.
---
### 5. Din haveprofil taler for "robust men intelligent"
Du har flere krav på én gang:
- høj ferie-sikkerhed
- drivhus og kapillærkasser
- mulighed for gødning
- Home Assistant-integration
- sandsynligvis lyst til senere forbedringer
Det er præcis det punkt, hvor OpenSprinkler-løsningen begynder at give mere værdi end en mere klassisk controller.
---
## Hvad jeg ikke ville gøre
### Jeg ville ikke gøre kapillærkasserne afhængige af HA
Kapillærkasserne bør være mekaniske.
Det gælder i begge forslag.
Derfor ville jeg holde fast i:
- flydventil i hver kasse
- simpel vandforsyning
- så få aktive komponenter som muligt
Det er den rigtige måde at gøre netop den del ferie-stabil.
---
### Jeg ville ikke starte med flowsensor som krav for dag 1
Flowsensor er en god idé, men ikke nødvendig for at komme i gang.
Jeg ville bygge systemet i denne rækkefølge:
1. controller
2. ventiler
3. hovedledning og zonefordeling
4. drypvanding
5. kapillærkasser
6. HA-logik
7. flowsensor og ekstra læk-overvågning
Så får du et brugbart system hurtigere, uden at gøre projektet unødigt tungt fra start.
---
## Hvornår jeg i stedet ville vælge Rain Bird
Jeg ville vælge Rain Bird-løsningen, hvis følgende var vigtigst:
- lokal controllerdrift er vigtigere end HA-dybde
- du vil have 5 klassiske zoner og mindst mulig controller-speciallogik
- du vil holde hardwareprisen lidt nede
- du accepterer lidt større usikkerhed på integrationen
Det er et reelt og fornuftigt valg.
Jeg synes bare ikke, det er det **bedste** valg i netop din opsætning.
---
## Min anbefalede version af det endelige system
Hvis jeg skulle vælge for dig, ville jeg sigte efter denne version:
### Controller
- OpenSprinkler
### Zonering
- 5 zoner fra start
- 3 zoner til højbede
- 1 zone til drivhusbed
- 1 zone til kapillærkasser
### Gødning
- Dosatron hvis du vil have reel automatisk drift med høj sikkerhed
- ellers venturi som budgetversion, men så med lavere forventning til præcision
### Drivhus
- én drypzone til drivhusbed
- én separat zone til 3 kapillærkasser på mekaniske flydventiler
### Sikkerhed
- filter
- trykreducer
- god serviceadgang
- senere flowsensor
### Home Assistant
- HA som beslutnings- og overvågningslag
- controller med lokal fallback
---
## Hvis jeg skulle optimere på budgettet
Hvis budgettet bliver afgørende, ville jeg ikke først spare på controlleren.
Jeg ville i stedet spare her:
1. starte uden flowsensor
2. starte med færre/færre bedre placerede jordfugtsensorer
3. udskyde Dosatron og begynde uden automatisk gødning eller med simpel venturi
Det vigtigste at få rigtigt fra starten er:
- rørføring
- ventilplacering
- filter
- trykregulering
- zoneopdeling
Det er de ting, der er mest irriterende at bygge om senere.
---
## Endelig anbefaling
### Mit valg
Jeg ville vælge:
OpenSprinkler + mekaniske flydventiler + mulighed for senere flowsensor
### Mit valg hvis budgettet skal ned
Jeg ville vælge:
OpenSprinkler + mekaniske flydventiler + venturi som midlertidig budget-gødningsløsning
### Mit valg hvis du vil have mest klassisk controller-setup
Så ville jeg vælge:
Rain Bird RC2 + 5 zoner + mekanisk kapillærgren
Men det ville være mit andenvalg i din konkrete opsætning.
---
## En sætning-versionen
Hvis jeg skal sige det helt kort:
**Jeg ville vælge OpenSprinkler-løsningen, fordi den passer bedre til dit Home Assistant-miljø, giver lavere integrationsrisiko og er den stærkeste platform, hvis systemet senere skal blive mere intelligent og stadig være ferie-stabilt.**
@@ -0,0 +1,262 @@
# Indkøbsliste Rain Bird-alternativ
Oprettet: april 2026
Denne liste hører sammen med [vandingssystem_alternativ_rainbird.md](./vandingssystem_alternativ_rainbird.md).
Målet er at gøre Rain Bird-løsningen konkret med realistiske produkter, som typisk kan findes i Danmark eller Tyskland.
> Bemærk: priser og lager skifter. Brug listen som indkøbsgrundlag, ikke som garanti for præcis pris eller tilgængelighed.
---
## 1. Controller
### Primært valg
| Produkt | Antal | Ca. pris | Butikstype | Note |
| --- | --- | --- | --- | --- |
| Rain Bird RC2, 8 station, 230V Outdoor | 1 | 1.400-1.900 kr | Tysk webshop / dansk vandingsbutik | Hovedcontroller |
### Tjek før køb
- at modellen reelt understøtter den HA-kompatible Rain Bird/LNK-løsning
- at den ikke tvinges over på nyere IQ4/2.0-platform uden HA-kompatibilitet
- at udendørs kabinet og 230V-variant er den rigtige model
### Butikstyper for controller
- Rain Bird-forhandlere i Tyskland
- Amazon.de
- danske vandingsspecialister
---
## 2. Ventiler og ventilbox
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| Rain Bird 100-DV 1" 24VAC magnetventil | 5 | 180-250 kr/stk | En ventil pr. zone |
| Ventilbox standard / jumbo | 1 | 300-500 kr | Til 5 ventiler samlet |
| Ventilmanifold 1" eller samling med nipler/T-stykker | 1 sæt | 250-500 kr | Gør montage lettere |
### Konkrete ventiltyper
- Rain Bird 100-DV 1"
- alternativt Hunter PGV 1" 24VAC hvis Rain Bird ikke er på lager
### Butikstyper for ventiler
- Vandingsspecialisten.dk
- Rig-Tig Vanding / tilsvarende danske havevandingsforhandlere
- Amazon.de
- tyske irrigation-webshops
---
## 3. Filtrering og trykregulering
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| 120 mesh filter, 3/4" eller 1" | 1 | 100-200 kr | Før drypsystem |
| Trykreducer til drypvanding, fx 1.5 bar | 1 | 150-250 kr | Til hovedzoner |
| Ekstra lavtryksregulator til kapillærkasser | 1 | 150-250 kr | Separat gren |
| Kugleventiler / afspærringsventiler | 3-5 | 40-100 kr/stk | Service og bypass |
| Y-splitter til vandhane | 1 | 75-150 kr | Manuel slange + system |
### Konkrete filter- og regulatorvalg
- 120 mesh inline irrigation filter
- Rain Bird / Netafim / Irritec trykreducer 1.0-1.5 bar
- messing kugleventiler til bypass og service
### Butikstyper for filter og trykregulering
- Bauhaus
- Harald Nyborg (simple fittings og kugleventiler)
- Vandingsspecialisten.dk
- Amazon.de
---
## 4. Rør, slanger og fittings
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| PE-rør 25 mm | 20 m | 200-350 kr | Nedgravet hovedledning |
| 16 mm driptubing | 50-100 m | 400-900 kr | Højbede + drivhus |
| 16 mm fittings (knæ, T, koblinger, ender) | 1 sæt | 200-400 kr | Distribution |
| 25 mm PE fittings | 1 sæt | 250-500 kr | Hovedlinje |
| Overgang 25 mm til manifold | 1 sæt | 100-200 kr | Samling ved ventilbox |
### Konkrete rør- og slangevalg
- 25 mm PE100 eller almindeligt vandings-PE-rør
- 16 mm drypslange/driptubing med trykkompenserede dryppere
- Rain Bird XF Dripline eller Netafim Techline som kvalitetsvalg
### Praktisk anbefaling for gødningssystemet
Til højbede ville jeg prioritere kvalitets-drypslange frem for den billigste løsning. Det er ofte her driftsstabiliteten afgøres.
---
## 5. Drivhus og kapillærkasser
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| Mini-flydventil / tank float valve | 3 | 80-150 kr/stk | En pr. kapillærkasse |
| 16 mm forsyningsslange til kasser | 1 sæt | 100-200 kr | Konstant vandgren |
| Mikrofordeling / 4 mm slanger | 1 sæt | 100-200 kr | Hvis nødvendigt i drivhus |
| Overflow-gennemføring / udløb | 3 | 30-60 kr/stk | Sikkerhed mod overløb |
### Konkrete drivhusdele
- mini float valve til reservoir / livestock tank / RO-tank
- gennemføring med pakning til sidevæg i kapillærkasser
- 4 mm mikro-irrigation fittings
### Butikstyper for drivhusdele
- Amazon.de
- eBay.de
- tyske greenhouse / irrigation-webshops
- hydroponics-butikker
---
## 6. Gødningssystem
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| Venturi-injektor 3/4" eller 1" | 1 | 150-400 kr | Billig fertigation |
| Bypass-loop fittings + ventiler | 1 sæt | 200-400 kr | Juster sug og flow |
| Gødningstank 20L | 1 | 100-200 kr | Koncentrat |
| Sugeslange med filter | 1 | 50-100 kr | Ned i tank |
### Konkrete gødningsdele
- Mazzei-lignende venturi-injektor eller tilsvarende irrigation venturi
- simpel 20L plastdunk med låg
- kemikaliebestandig sugeslange
### Praktisk anbefaling
Hvis du vælger venturi:
- brug det kun til de zoner der reelt skal have gødning
- hold kapillærkasserne udenfor den kontinuerte gødningsgren
- byg bypass, så venturi kan isoleres helt
---
## 7. Sensorer
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| Jordfugtsensor til højbed | 1-2 | 150-900 kr/stk | Afhænger af ambitionsniveau |
| Jordfugtsensor til drivhus | 1 | 150-900 kr/stk | Til zone 5 |
| Flowsensor (senere) | 1 | 300-1.200 kr | Ekstra fail-safe |
| Læksensor (senere) | 1-2 | 100-300 kr/stk | Ved husmur / ventilbox |
### Mulige retninger
Budget:
- Tuya Zigbee jordfugtsensorer
Mere seriøst:
- Vegetronix / SMT / industrielle sensorer med kendt kalibrering
### Praktisk anbefaling for sensorer
Hvis du går med Rain Bird-varianten, vil jeg holde sensorerne i HA-laget og ikke gøre hele løsningen afhængig af dem for basal drift.
---
## 8. El og montage
| Produkt | Antal | Ca. pris | Note |
| --- | --- | --- | --- |
| Udendørs godkendt 24VAC installationskabel | passende længde | 150-300 kr | Fra controller til ventilbox |
| Vandtætte samlemuffer / gel connectors | 1 sæt | 100-200 kr | Til ventilledninger |
| Monteringsskruer / rawlplugs | 1 sæt | 50-100 kr | Controller og bokse |
| Kabelflex eller beskyttelse | efter behov | 100-200 kr | Hvor kabel udsættes |
---
## 9. Min anbefalede indkøbspakke
Hvis jeg skulle købe denne løsning ind i praksis, ville jeg starte med:
### Kernepakke
- 1 × Rain Bird RC2 Outdoor 8-zone
- 5 × Rain Bird 100-DV 1"
- 1 × ventilbox til 5 ventiler
- 20 m PE-rør 25 mm
- 50-100 m 16 mm kvalitets-driptubing
- 1 × 120 mesh filter
- 1 × trykreducer til dryp
- 1 × ekstra regulator til kapillærgrenen
- 1 × venturi-injektor
- 1 × 20L gødningsdunk
- 3 × mini-flydventiler
- fittings-pakker til både 25 mm og 16 mm
- 24VAC kabel + vandtætte samlemuffer
### Bør tilføjes tidligt
- mindst 1 jordfugtsensor i højbedsområdet
- mindst 1 jordfugtsensor i drivhuset
### Bør tilføjes senere
- 1 flowsensor
- 1-2 læksensorer
---
## 10. Hvad jeg ville prioritere kvalitetsmæssigt
Hvis budgettet skal bruges rigtigt, ville jeg prioritere kvalitet i denne rækkefølge:
1. Drypslanger og fittings
2. Ventiler
3. Filter og trykreducer
4. Ventilbox og servicevenlig montage
5. Sensorer
6. Venturi
Venturi må gerne være enkel. Det vigtigste er, at vandføringen, filteret og fordelingssystemet er stabilt.
---
## 11. Butikstyper jeg ville bruge
### Danmark
- Vandingsspecialisten.dk
- Bauhaus
- Harald Nyborg til simple fittings og kugleventiler
### Tyskland
- Amazon.de
- specialiserede irrigation-webshops
- greenhouse / hydroponics-webshops til float valves og mikrodele
---
## 12. Slutvurdering
Denne indkøbsliste giver en realistisk vej til at bygge Rain Bird-løsningen uden at gøre den for eksotisk.
Hvis du vil holde det robust i 3 ugers ferie, vil jeg især fokusere på:
- god filtrering
- ordentlig trykregulering
- kvalitets-drypslange
- enkel kapillærgren med mekaniske flydventiler
- flowovervågning som næste trin
+252
View File
@@ -0,0 +1,252 @@
# Gulvvarme: Wavin bryggers + køkken → HA styring
## Idiot-sikker installationsguide
**Formål:** Erstatte den dumme RF-modtager (Wavin JT6/3003-boksen) med to Sonoff ZBMINI Zigbee-relæer,
så Home Assistant kan styre bryggers og køkken-gulvvarme præcis som de andre rum.
---
## Del 1: Indkøb
| Vare | Antal | Pris ca. | Link/søg |
|------|-------|----------|----------|
| **Sonoff ZBMINI-L2** (Zigbee relæ, ingen nul-ledning) | 2 | ~130 kr/stk | Aliexpress, Elgiganten |
| **SONOFF SNZB-02D** Zigbee temp/fugt sensor | 2 | ~100 kr/stk | Aliexpress |
> **Vigtigt:** Vælg ZBMINI-**L2** (eller ZBMINI Extreme) den kræver **ikke** en nuleder (N).
> Wavin-boksen har måske ikke nuleder fremme til brug for et relæ.
---
## Del 2: Forståelse af Wavin-boksen
Når du kigger på det grønne printplade med låget af:
```
MAINS IND (fra stikkontakt i væggen):
Brun = FASE (L) "det farlige"
Blå = NUL (N)
KANAL X (til aktuator 1, fx bryggers):
Brun = FASE UD til aktuator
KANAL Y (til aktuator 2, fx køkken):
Brun = FASE UD til aktuator
Aktuatorerne får NUL fra boksen via blå ledning.
```
Boksen virker som et simpelt on/off relæ per kanal:
- Når termostaten sender "varm op" → relæet lukker → 230V fase sendes ud til aktuatoren → ventil åbner
- Sonoff ZBMINI erstatter præcis dette relæ
---
## Del 3: Installation trin for trin
### ⚠️ STOP Sluk strøm FØR du rører noget
1. Find den sikring eller kontakt der forsyner Wavin-boksen
2. Sluk den
3. Brug en spændingsprøver/-tester på de brune ledninger inde i boksen bekræft at der er 0V
---
### Trin 1: Fotografér ledningerne i boksen FØR du piller noget
Tag et billede med din telefon. Du vil gerne huske hvad der sidder hvor.
---
### Trin 2: Identificér de 4 relevante ledninger
I Wavin-boksen sidder:
- **Brun ind** = Fase fra væggen (fælles for begge kanaler)
- **Blå ind** = Nul fra væggen (fælles)
- **Brun ud X** = Fase ud til aktuator bryggers
- **Brun ud Y** = Fase ud til aktuator køkken
(De blå ledninger der går ud er nuleder direkte til aktuatorerne de ændres ikke)
---
### Trin 3: Monter Sonoff ZBMINI-L2 nr. 1 (bryggers)
ZBMINI-L2 har disse klemmer:
```
[ L in ] [ L out ] [ S1 ] [ S2 ]
```
Tilslut:
- **L in** ← Brun fase ind fra væggen (eller tag en aftapning fra eksisterende brun)
- **L out** → Brun fase ud til bryggers-aktuatoren (den ledning der tidligere sad i X-relæet)
- **S1/S2** = bruges kun hvis du vil have en fysisk kontakt lad dem sidde tomme
Sonoff ZBMINI-L2 kræver ikke N (nuleder) det er pointen med L2-modellen.
---
### Trin 4: Monter Sonoff ZBMINI-L2 nr. 2 (køkken)
Identisk som trin 3, men brug Y-kanalens udgang:
- **L in** ← Brun fase ind (kan sidde på samme aftapning som nr. 1)
- **L out** → Brun fase ud til køkken-aktuatoren
---
### Trin 5: Wavin RF-modtagerboksen
Den eksisterende boks kobles nu **forbi** dens relæer bruges ikke længere.
Du kan enten:
- Efterlade den hængende (ufarlig, bare strøm ind og tomme udgange)
- Klippe strømmen til den (tag brun og blå ind ud af klemmerne og tape enderne)
Den gamle Wavin termostat på væggen virker stadig men gør intet du kan efterlade den eller tage den ned.
---
### Trin 6: Gendan strøm og test
1. Sæt strøm til igen
2. Begge Sonoff-enheder bør lyse rødt (venter på pairing)
---
## Del 4: Zigbee-pairing i Home Assistant
1. Gå til **Indstillinger → Enheder → Zigbee2MQTT** (eller ZHA hvis du bruger det)
2. Klik **Tillad tilslutning / Permit join** (60 sekunder)
3. Hold knappen på Sonoff ZBMINI nede i 5 sekunder til LED blinker hurtigt
4. Enheden dukker op navngiv den `bryggers_relæ` og `kokken_relæ`
5. Gentag for temp-sensorerne (tryk lille knap på siden for at parre)
---
## Del 5: Home Assistant konfiguration
### 5a: generic_thermostat (climate entity)
Tilføj til `configuration.yaml` (eller en inkluderet fil):
```yaml
climate:
- platform: generic_thermostat
name: Bryggers
unique_id: generic_thermostat_bryggers
heater: switch.bryggers_relae # Sonoff enhedens switch entity
target_sensor: sensor.bryggers_temp_sensor_temperature
min_temp: 15
max_temp: 28
target_temp: 20
cold_tolerance: 0.3
hot_tolerance: 0.3
min_cycle_duration:
minutes: 5
ac_mode: false
- platform: generic_thermostat
name: Køkken
unique_id: generic_thermostat_kokken
heater: switch.kokken_relae
target_sensor: sensor.kokken_temp_sensor_temperature
min_temp: 15
max_temp: 28
target_temp: 20
cold_tolerance: 0.3
hot_tolerance: 0.3
min_cycle_duration:
minutes: 5
ac_mode: false
```
> Tilpas entity-navnene til hvad Zigbee2MQTT faktisk kalder dem efter pairing.
### 5b: input_number til komforttemperaturer
Tilføj til `include/input/number/varme.yaml`:
```yaml
varme_komfort_bryggers:
name: Komfort - Bryggers
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 20
icon: mdi:thermometer
varme_komfort_kokken:
name: Komfort - Køkken
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 20
icon: mdi:thermometer
```
### 5c: Tilføj til varme_recalculate scriptet
De to nye rum skal med i `include/scripts/varme_styring.yaml``varme_recalculate`
på samme måde som badeværelse og stue (Danfoss Ally-mønsteret):
```yaml
# ---- Bryggers generic_thermostat ----
- if:
- condition: template
value_template: "{{ true }}" # ingen vinduessensor endnu
then:
- service: climate.set_temperature
target:
entity_id: climate.bryggers
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_bryggers') | float(20) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
# ---- Køkken generic_thermostat ----
- if:
- condition: template
value_template: "{{ true }}"
then:
- service: climate.set_temperature
target:
entity_id: climate.kokken
data:
hvac_mode: heat
temperature: >
{% set k = states('input_number.varme_komfort_kokken') | float(20) %}
{% if vacation %} {{ ferie_temp }}
{% elif night %} {{ [k - nat_sænk, 15] | max }}
{% elif not home %} {{ [k - vaek_sænk, 15] | max }}
{% else %} {{ k }}
{% endif %}
```
---
## Del 6: Verificering
Når alt er sat op:
1. Gå til **Udviklerværktøjer → Tjenester**
2. Kald `climate.set_temperature``climate.bryggers` med `temperature: 25`
3. Lyt efter at aktuatoren klikker (kan høres eller mærkes) inden for 1-2 minutter
4. Sæt tilbage til normal komforttemperatur
---
## Resumé: Hvad du køber
| | |
|---|---|
| 2× Sonoff ZBMINI-L2 | ~260 kr |
| 2× Sonoff SNZB-02D temp-sensor | ~200 kr |
| **Total** | **~460 kr** |
Ingen elektriker, ingen nye kabler til aktuatorerne, ingen cloud-afhængighed.
+91
View File
@@ -0,0 +1,91 @@
# Zigbee husplan og netværksnoter
## Fysisk layout
```
NORD/INDKØRSEL-SIDE
══════════════════════════════════════════════════════════════════
GARAGE
[stik_fryser] ←── fjern ende (mod nord)
[garageport sensor] [stik_indkørsel] ←── tæt ende (mod kontor/syd)
══════════════ GARAGEMUR (beton - dæmper signal markant) ══════════
[stik_bryggers] [køkken] [forgang] [stik_lillebad] [stik_kontor]
↑ indkørslen løber langs denne side (bryggers → køkken → forgang → lille bad → badeværelse → kontor)
══════════════════════════════════════════════════════════════════
[badeværelse] [stik_bad]
[stik_sonos_stue] [stik_quooker] [stue]
[stik_daniel] (Daniels værelse - nabo til Andreas og over for bad)
[stik_soveværelse] (nabo til Daniel og kontor)
[stik_andreas] (Andreas værelse)
[stik_alrum]
SYD/STUE-SIDE
KOORDINATOR: Sonoff ZBDongle-E sidder på loftet over stue/Andreas-siden
```
## Zigbee enheder
| Enhed | Type | Placering |
|-------|------|-----------|
| SONOFF ZBDongle-E | Coordinator | Loft over stue/Andreas |
| stik_indkørsel | Router (TS011F) | Garage, tæt ende mod kontor |
| stik_fryser | Router (TS011F) | Garage, fjern ende mod nord |
| stik_kontor | Router (TS011F) | Kontor |
| stik_bryggers | Router (TS011F) | Bryggers |
| stik_lillebad | Router (TS011F) | Lille bad |
| stik_bad | Router (TS011F) | Badeværelse |
| stik_daniel | Router (TS011F) | Daniels værelse |
| stik_soveværelse | Router (TS011F) | Soveværelse |
| stik_andreas | Router (TS011F) | Andreas' værelse |
| stik_alrum | Router (TS011F) | Alrum |
| stik_sonos_stue | Router (TS011F) | Stue (Sonos) |
| stik_quooker | Router (TS011F) | Køkken (Quooker) |
| garageport | EndDevice (3RDTS01056Z) | Garage, tæt ende - tiltssensor på garageport |
| badevarelse | EndDevice | Badeværelse |
| stue | EndDevice | Stue |
| temp_bryggers | EndDevice | Bryggers (temperatursensor) |
| temp_køkken | EndDevice | Køkken (temperatursensor) |
| LUMI magnetsensorer (×6) | EndDevice | Spredt i huset |
## LQI-målinger over tid
| Enhed | 18/5 (morgen) | 18/5 (aften) | 20/5 | Bemærkning |
|-------|--------------|-------------|------|------------|
| stik_alrum | 184192 | 188192 | 184 | Stærk, tæt på koordinator |
| stik_andreas | 184192 | 188192 | 184 | Stærk, tæt på koordinator |
| stik_soveværelse | 76192 | 76188 | 84 | Svingende — route-afhængig |
| stik_quooker | 144152 | 124148 | 144 | God |
| stik_sonos_stue | 108152 | 108152 | 148 | God |
| stik_lillebad | 112136 | 112136 | 144 | OKGod |
| stik_daniel | — | 100120 | 92 | OK |
| stik_bryggers | 100132 | 100132 | 108 | OK |
| stik_bad | 40104 | 96144 | 144 | Forbedret |
| stik_kontor | 5296 | 7296 | 96 | Forbedret |
| stik_fryser | 5684 | 5684 | 84 | Forbedret |
| stik_indkørsel | 4480 | 56124 | 84 | OK efter genstart |
| garageport sensor | 4092 | 5292 | 84 | Bedste måling! |
| badevarelse | 108136 | 108136 | 144 | God |
| stue | 84116 | 84116 | 112 | OK |
| temp_bryggers | — | — | 148 | Ny 20/5 |
| temp_køkken | — | — | 152 | Ny 20/5 |
## Kendte problemer
- **Garagemuren** dæmper signalet markant — alle enheder bag muren har LQI 4080
- **Garageport-sensoren** er tæt på grænsen og har tidligere været unavailable
- Koordinatoren sidder i den modsatte ende af huset fra garagen
## Optimeringforslag
1. **Flyt koordinatoren til midten** (forgang/køkken-loftet) — størst effekt, kræver blot USB-forlænger
2. **Tilsæt router i forgang/gang** tæt på garagemur — bedre mellemled til garagen
3. stik_fryser er acceptabelt svag hvis fryseren blot er til strømmåling
## Entiteter der styrer indkørselslys
- `switch.stik_indkorsel` — Zigbee plug (erstattede `light.indkorsel_plug` fra Hue, maj 2026)
- `light.indkorsel_2` — Hue gruppe (garage venstre + højre + bryggersdør)
- `scene.indkorsel_bright` / `scene.indkorsel_dimmed` — Hue scener
- Automationer: `lysindkorsel.yaml`, `presence_simulation.yaml`, `andreas_kommer_hjem_taend_lys.yaml`
+7
View File
@@ -9,6 +9,13 @@
{% set last = state_attr('automation.ai_overvagning', 'last_triggered') %} {% set last = state_attr('automation.ai_overvagning', 'last_triggered') %}
{% set someone_home = is_state('binary_sensor.family_presence', 'on') %} {% set someone_home = is_state('binary_sensor.family_presence', 'on') %}
{{ not someone_home or last is none or (now() - last).total_seconds() > 900 }} {{ not someone_home or last is none or (now() - last).total_seconds() > 900 }}
- condition: not
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state:
- cleaning
- returning
actions: actions:
- action: script.overvaagning - action: script.overvaagning
metadata: {} metadata: {}
+20 -48
View File
@@ -7,6 +7,10 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdagimorgen entity_id: binary_sensor.arbejdsdagimorgen
state: 'on' state: 'on'
- condition: template
value_template: >-
{{ not is_state('input_select.anne_status', 'syg') and
not is_state('input_select.claus_status', 'syg') }}
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_1782 entity_id: switch.sonos_alarm_1782
@@ -31,6 +35,8 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdagimorgen entity_id: binary_sensor.arbejdsdagimorgen
state: 'on' state: 'on'
- condition: template
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_445 entity_id: switch.sonos_alarm_445
@@ -47,30 +53,6 @@
- service: homeassistant.turn_off - service: homeassistant.turn_off
entity_id: switch.sonos_alarm_445 entity_id: switch.sonos_alarm_445
- alias: 'Turn on alarms Andreas Tuesdays'
trigger:
platform: time
at: '20:05:20'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: 'on'
action:
- service: homeassistant.turn_on
entity_id: switch.sonos_alarm_1824
- alias: 'Turn off alarms Andreas Tuesdays'
trigger:
platform: time
at: '20:00:20'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: 'off'
action:
- service: homeassistant.turn_off
entity_id: switch.sonos_alarm_1824
- alias: 'Turn on alarms Andreas Saturdays' - alias: 'Turn on alarms Andreas Saturdays'
trigger: trigger:
platform: time platform: time
@@ -82,6 +64,8 @@
value_template: '{{ now().date() | string != "2022-12-24" }}' value_template: '{{ now().date() | string != "2022-12-24" }}'
- condition: template - condition: template
value_template: '{{ now().date() | string != "2022-12-31" }}' value_template: '{{ now().date() | string != "2022-12-31" }}'
- condition: template
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_1874 entity_id: switch.sonos_alarm_1874
@@ -102,6 +86,8 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdagimorgen entity_id: binary_sensor.arbejdsdagimorgen
state: 'on' state: 'on'
- condition: template
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_377 entity_id: switch.sonos_alarm_377
@@ -127,6 +113,8 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdagimorgen entity_id: binary_sensor.arbejdsdagimorgen
state: 'on' state: 'on'
- condition: template
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_1894 entity_id: switch.sonos_alarm_1894
@@ -152,6 +140,8 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdagimorgen entity_id: binary_sensor.arbejdsdagimorgen
state: 'on' state: 'on'
- condition: template
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_2273 entity_id: switch.sonos_alarm_2273
@@ -179,6 +169,8 @@
value_template: '{{ now().date() | string != "2022-12-24" }}' value_template: '{{ now().date() | string != "2022-12-24" }}'
- condition: template - condition: template
value_template: '{{ now().date() | string != "2022-12-31" }}' value_template: '{{ now().date() | string != "2022-12-31" }}'
- condition: template
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_3471 entity_id: switch.sonos_alarm_3471
@@ -201,6 +193,10 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdagimorgen entity_id: binary_sensor.arbejdsdagimorgen
state: 'on' state: 'on'
- condition: template
value_template: >-
{{ not is_state('input_select.anne_status', 'syg') and
not is_state('input_select.claus_status', 'syg') }}
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
entity_id: switch.sonos_alarm_298 entity_id: switch.sonos_alarm_298
@@ -218,27 +214,3 @@
- service: homeassistant.turn_off - service: homeassistant.turn_off
entity_id: switch.sonos_alarm_298 entity_id: switch.sonos_alarm_298
- alias: 'Turn on alarms Badeværelse Afsted'
trigger:
platform: time
at: '20:07:10'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: 'on'
action:
- service: homeassistant.turn_on
entity_id: switch.sonos_alarm_1899
- alias: 'Turn off alarms Badeværelse Afsted'
trigger:
platform: time
at: '20:06:20'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: 'off'
action:
- service: homeassistant.turn_off
entity_id: switch.sonos_alarm_1899
@@ -29,10 +29,13 @@
action: action:
- variables: - variables:
lights: lights: >
- light.indkorsel_2 {% set base = ['light.indkorsel_2', 'light.garage'] %}
- light.extended_color_light_1 {% if now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 %}
- light.garage {{ (base + ['light.extended_color_light_1']) | list }}
{% else %}
{{ base }}
{% endif %}
lights_to_turn_on: > lights_to_turn_on: >
{{ lights | select('is_state','off') | list }} {{ lights | select('is_state','off') | list }}
@@ -45,9 +48,17 @@
target: target:
entity_id: "{{ lights_to_turn_on }}" entity_id: "{{ lights_to_turn_on }}"
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- delay: "00:10:00" - delay: "00:10:00"
- service: light.turn_off - service: light.turn_off
target: target:
entity_id: "{{ lights_to_turn_on }}" entity_id: "{{ lights_to_turn_on }}"
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
+8 -2
View File
@@ -34,7 +34,10 @@
- condition: trigger - condition: trigger
id: open_garage id: open_garage
sequence: sequence:
- service: cover.open_cover - condition: state
entity_id: binary_sensor.garageport
state: "off"
- service: cover.toggle
target: target:
entity_id: cover.anne entity_id: cover.anne
@@ -42,7 +45,10 @@
- condition: trigger - condition: trigger
id: close_garage id: close_garage
sequence: sequence:
- service: cover.close_cover - condition: state
entity_id: binary_sensor.garageport
state: "on"
- service: cover.toggle
target: target:
entity_id: cover.anne entity_id: cover.anne
@@ -2,7 +2,15 @@
trigger: trigger:
platform: state platform: state
entity_id: binary_sensor.indkorsel_sensor_motion entity_id: binary_sensor.indkorsel_sensor_motion
to: 'on' to: 'on'
condition:
- condition: not
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state:
- cleaning
- returning
action: action:
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
@@ -23,6 +23,13 @@
- condition: state - condition: state
entity_id: binary_sensor.family_presence entity_id: binary_sensor.family_presence
state: "off" state: "off"
- condition: not
conditions:
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state:
- cleaning
- returning
action: action:
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
-430
View File
@@ -1,430 +0,0 @@
# logik
# hvis om dagen, så høj lydstyrke. Gem sonos-config. udkoble alle. Ding-dong i lille bad og hund der gør i alrum. Blink med lamperne.
# send push besked til telefoner
- id: '1672487404009'
alias: Ringklokke bagdør
description: Når det ringer på bagdør, send besked, lav lyd og blink
trigger:
- platform: mqtt
topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}'
condition: []
action:
- choose:
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.event == "S" }}'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
message: Det ringer på bagdøren old
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren old
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data:
volume_level: 0.5
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/doorbell-shortened-100308.mp3
media_content_type: audio/mpeg
metadata:
title: doorbell-shortened-100308.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: scene.create
data:
scene_id: before
snapshot_entities:
- light.pendle1
- service: light.turn_on
data:
entity_id: light.pendle1
brightness: 255
rgb_color: [255, 0, 0]
flash: long
- delay: 2
- service: scene.turn_on
entity_id: scene.before
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/doorbell.mp3
media_content_type: audio/mpeg
metadata:
title: doorbell.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.andreas
- service: media_player.play_media
target:
entity_id: media_player.andreas
data:
media_content_id: media-source://media_source/local/doorbell.mp3
media_content_type: audio/mpeg
metadata:
title: doorbell.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.daniel
- service: media_player.play_media
target:
entity_id: media_player.daniel
data:
media_content_id: media-source://media_source/local/doorbell.mp3
media_content_type: audio/mpeg
metadata:
title: doorbell.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på bagdøren
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- service: scene.create
data:
scene_id: before
snapshot_entities:
- light.pendle1
- service: light.turn_on
data:
entity_id: light.pendle1
brightness: 255
rgb_color: [255, 0, 0]
flash: long
- delay: 2
- service: scene.turn_on
entity_id: scene.before
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.event == "SS" }}'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
message: Det ringer på bagdøren - doublepress
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren - doublepress
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data:
volume_level: 0.5
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/german-shephard.mp3
media_content_type: audio/mpeg
metadata:
title: german-shephard.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/german-shephard.mp3
media_content_type: audio/mpeg
metadata:
title: german-shephard.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på bagdøren
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.event == "SSS" }}'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
message: Det ringer på bagdøren - triple-press
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren - triple-press
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data:
volume_level: 0.5
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
media_content_type: audio/mpeg
metadata:
title: dog-barking-2-bullmastiff.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
media_content_type: audio/mpeg
metadata:
title: dog-barking-2-bullmastiff.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- conditions:
- condition: template
value_template: '{{ trigger.payload_json.event == "L" }}'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
message: Det ringer på bagdøren - long-press
- service: notify.mobile_app_annes_iphone_14_pro
data:
message: Det ringer på bagdøren - long-press
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data:
volume_level: 0.5
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/two-tone-chime.mp3
media_content_type: audio/mpeg
metadata:
title: two-tone-chime.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/two-tone-chime.mp3
media_content_type: audio/mpeg
metadata:
title: two-tone-chime.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
mode: single
trigger_variables:
button_id: 98CDAC1E5F42
+113 -262
View File
@@ -10,6 +10,32 @@
topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}' topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}'
condition: [] condition: []
action: action:
# Gem gammel og ny event_cnt
- variables:
new_cnt: "{{ trigger.payload_json.event_cnt | int(0) }}"
old_cnt: "{{ states('input_number.shelly_bagdor_event_cnt') | int(-1) }}"
# Opdater counter ALTID (ogsaa ved wake-up)
- service: input_number.set_value
target:
entity_id: input_number.shelly_bagdor_event_cnt
data:
value: "{{ new_cnt }}"
# Log ALLE MQTT events (ogsaa filtrerede) til logbog for debugging
- service: logbook.log
data:
name: "Shelly bagdoer"
message: >-
MQTT event={{ trigger.payload_json.event }}
event_cnt={{ new_cnt }} (old={{ old_cnt }})
battery={{ trigger.payload_json.battery | default('?') }}%
entity_id: input_number.shelly_bagdor_event_cnt
# Stop hvis: foerste sync efter restart (old=-1) eller samme cnt (periodisk wake-up)
- condition: template
value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}"
# Bloker ringeklokke om natten (22-06)
- condition: time
after: '06:00:00'
before: '22:00:00'
- choose: - choose:
- conditions: - conditions:
- condition: template - condition: template
@@ -27,39 +53,28 @@
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "SS" }}' value_template: '{{ trigger.payload_json.event == "SS" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på bagdøren (2) - doublepress - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: - service: script.spil_paa_lille_bad
message: Det ringer på bagdøren (2) - doublepress data:
- choose: lydfil: german-shephard.mp3
- conditions: volumen: "{{ lille_bad_volumen }}"
- condition: time - sequence:
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set - service: media_player.volume_set
data: data:
volume_level: 0.5 volume_level: 0.8
target: target:
entity_id: media_player.lille_badevaerelse entity_id: media_player.andreas
- service: media_player.play_media - service: media_player.play_media
target: target:
entity_id: media_player.lille_badevaerelse entity_id: media_player.andreas
data: data:
media_content_id: media-source://media_source/local/german-shephard.mp3 media_content_id: media-source://media_source/local/doorbell.mp3
media_content_type: audio/mpeg media_content_type: audio/mpeg
metadata: metadata:
title: german-shephard.mp3 title: doorbell.mp3
thumbnail: thumbnail:
media_class: music media_class: music
children_media_class: children_media_class:
@@ -67,259 +82,95 @@
- {} - {}
- media_content_type: app - media_content_type: app
media_content_id: media-source://media_source media_content_id: media-source://media_source
default: - sequence:
- service: media_player.volume_set - service: media_player.volume_set
data: data:
volume_level: 0.8 volume_level: 0.8
target: target:
entity_id: media_player.lille_badevaerelse entity_id: media_player.daniel
- service: media_player.play_media - service: media_player.play_media
target: target:
entity_id: media_player.lille_badevaerelse entity_id: media_player.daniel
data: data:
media_content_id: media-source://media_source/local/german-shephard.mp3 media_content_id: media-source://media_source/local/doorbell.mp3
media_content_type: audio/mpeg media_content_type: audio/mpeg
metadata: metadata:
title: german-shephard.mp3 title: doorbell.mp3
thumbnail: thumbnail:
media_class: music media_class: music
children_media_class: children_media_class:
navigateIds: navigateIds:
- {} - {}
- media_content_type: app - media_content_type: app
media_content_id: media-source://media_source media_content_id: media-source://media_source
- service: media_player.volume_set - sequence:
data: - service: tts.speak
volume_level: 0.8 target:
target: entity_id: tts.google_ai_tts
entity_id: media_player.andreas data:
- service: media_player.play_media media_player_entity_id: media_player.alrum
target: message: "Der er nogen der ringer på bagdøren"
entity_id: media_player.andreas - sequence:
data: - service: notify.mobile_app_claus_iphone_15pro
media_content_id: media-source://media_source/local/doorbell.mp3 data:
media_content_type: audio/mpeg message: Det ringer på bagdøren - doublepress
metadata: - service: notify.mobile_app_annes_iphone_14_pro
title: doorbell.mp3 data:
thumbnail: message: Det ringer på bagdøren - doublepress
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.daniel
- service: media_player.play_media
target:
entity_id: media_player.daniel
data:
media_content_id: media-source://media_source/local/doorbell.mp3
media_content_type: audio/mpeg
metadata:
title: doorbell.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på bagdøren
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "SSS" }}' value_template: '{{ trigger.payload_json.event == "SSS" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på bagdøren (2) - triple-press - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: - service: script.spil_paa_lille_bad
message: Det ringer på bagdøren (2) - triple-press
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data: data:
volume_level: 0.5 lydfil: dog-barking-2-bullmastiff.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
target: target:
entity_id: media_player.lille_badevaerelse entity_id: tts.google_ai_tts
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data: data:
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3 media_player_entity_id: media_player.alrum
media_content_type: audio/mpeg message: "Der er nogen der ringer på bagdøren"
metadata: - sequence:
title: dog-barking-2-bullmastiff.mp3 - service: notify.mobile_app_claus_iphone_15pro
thumbnail: data:
media_class: music message: Det ringer på bagdøren - triple-press
children_media_class: - service: notify.mobile_app_annes_iphone_14_pro
navigateIds: data:
- {} message: Det ringer på bagdøren - triple-press
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
media_content_type: audio/mpeg
metadata:
title: dog-barking-2-bullmastiff.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på bagdøren
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "L" }}' value_template: '{{ trigger.payload_json.event == "L" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på bagdøren (2) - long-press - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: - service: script.spil_paa_lille_bad
message: Det ringer på bagdøren (2) - long-press
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data: data:
volume_level: 0.5 lydfil: two-tone-chime.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
target: target:
entity_id: media_player.lille_badevaerelse entity_id: tts.google_ai_tts
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data: data:
media_content_id: media-source://media_source/local/two-tone-chime.mp3 media_player_entity_id: media_player.alrum
media_content_type: audio/mpeg message: "Der er nogen der ringer på bagdøren"
metadata: - sequence:
title: two-tone-chime.mp3 - service: notify.mobile_app_claus_iphone_15pro
thumbnail: data:
media_class: music message: Det ringer på bagdøren - long-press
children_media_class: - service: notify.mobile_app_annes_iphone_14_pro
navigateIds: data:
- {} message: Det ringer på bagdøren - long-press
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/two-tone-chime.mp3
media_content_type: audio/mpeg
metadata:
title: two-tone-chime.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
mode: single mode: single
trigger_variables: trigger_variables:
@@ -0,0 +1,21 @@
- id: 'shelly_doorbell_low_battery'
alias: Ringklokke lavt batteri
description: Notifikation når en Shelly doerklokke-knap har under 30% batteri
trigger:
- platform: numeric_state
entity_id:
- sensor.shelly_bagdoer_batteri
- sensor.shelly_fordoer_batteri
below: 30
for:
minutes: 5
condition: []
action:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Lavt batteri - dørklokke"
message: >-
{{ trigger.to_state.attributes.friendly_name }}
er på {{ trigger.to_state.state }}%.
Oplad snart.
mode: single
+121 -327
View File
@@ -11,51 +11,61 @@
topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}' topic: '{{''shellies/shellybutton1-'' ~ button_id ~ ''/input_event/0''}}'
condition: [] condition: []
action: action:
# Gem gammel og ny event_cnt
- variables:
new_cnt: "{{ trigger.payload_json.event_cnt | int(0) }}"
old_cnt: "{{ states('input_number.shelly_fordor_event_cnt') | int(-1) }}"
# Opdater counter ALTID (ogsaa ved wake-up)
- service: input_number.set_value
target:
entity_id: input_number.shelly_fordor_event_cnt
data:
value: "{{ new_cnt }}"
# Log ALLE MQTT events (ogsaa filtrerede) til logbog for debugging
- service: logbook.log
data:
name: "Shelly fordoer"
message: >-
MQTT event={{ trigger.payload_json.event }}
event_cnt={{ new_cnt }} (old={{ old_cnt }})
battery={{ trigger.payload_json.battery | default('?') }}%
entity_id: input_number.shelly_fordor_event_cnt
# Stop hvis: foerste sync efter restart (old=-1) eller samme cnt (periodisk wake-up)
- condition: template
value_template: "{{ old_cnt >= 0 and new_cnt != old_cnt }}"
# Bloker ringeklokke om natten (22-06)
- condition: time
after: '06:00:00'
before: '22:00:00'
- choose: - choose:
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "S" }}' value_template: '{{ trigger.payload_json.event == "S" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på fordøren - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: lille_bad_lydfil: "{{ 'Halloween-doorbell.mp3' if (now().hour >= 20 or now().hour < 6) else 'doorbell.mp3' }}"
message: Det ringer på fordøren - service: script.spil_paa_lille_bad
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data: data:
volume_level: 0.5 lydfil: "{{ lille_bad_lydfil }}"
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
target: target:
entity_id: media_player.lille_badevaerelse entity_id: tts.google_ai_tts
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data: data:
media_content_id: media-source://media_source/local/Halloween-doorbell.mp3 media_player_entity_id: media_player.alrum
media_content_type: audio/mpeg message: "Der er nogen der ringer på fordøren"
metadata: - sequence:
title: Halloween-doorbell.mp3 - service: notify.mobile_app_claus_iphone_15pro
thumbnail: data:
media_class: music message: Det ringer på fordøren
children_media_class: - service: notify.mobile_app_annes_iphone_14_pro
navigateIds: data:
- {} message: Det ringer på fordøren
- media_content_type: app - sequence:
media_content_id: media-source://media_source
- service: scene.create - service: scene.create
data: data:
scene_id: before scene_id: before
@@ -70,320 +80,104 @@
- delay: 2 - delay: 2
- service: scene.turn_on - service: scene.turn_on
entity_id: scene.before entity_id: scene.before
- sequence:
default: - condition: template
- service: media_player.volume_set value_template: >
data: {{ states('sensor.forgang_sensor_illuminance') | int < 60 }}
volume_level: 0.8 - choose:
target: - conditions:
entity_id: media_player.lille_badevaerelse - condition: time
- service: media_player.play_media after: "06:00:00"
target: before: "23:59:00"
entity_id: media_player.lille_badevaerelse sequence:
data: - service: scene.turn_on
media_content_id: media-source://media_source/local/doorbell.mp3 target:
media_content_type: audio/mpeg entity_id: scene.forgang_bright
metadata: default:
title: doorbell.mp3 - service: scene.turn_on
thumbnail: target:
media_class: music entity_id: scene.forgang_dimmed
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- service: scene.create
data:
scene_id: before
snapshot_entities:
- light.pendle1
- service: light.turn_on
data:
entity_id: light.pendle1
brightness: 255
rgb_color: [255, 0, 0]
flash: long
- delay: 2
- service: scene.turn_on
entity_id: scene.before
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "SS" }}' value_template: '{{ trigger.payload_json.event == "SS" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på fordøren - doublepress - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: - service: script.spil_paa_lille_bad
message: Det ringer på fordøren - doublepress
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data: data:
volume_level: 0.5 lydfil: german-shephard.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
target: target:
entity_id: media_player.lille_badevaerelse entity_id: tts.google_ai_tts
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data: data:
media_content_id: media-source://media_source/local/german-shephard.mp3 media_player_entity_id: media_player.alrum
media_content_type: audio/mpeg message: "Der er nogen der ringer på fordøren"
metadata: - sequence:
title: german-shephard.mp3 - service: notify.mobile_app_claus_iphone_15pro
thumbnail: data:
media_class: music message: Det ringer på fordøren - doublepress
children_media_class: - service: notify.mobile_app_annes_iphone_14_pro
navigateIds: data:
- {} message: Det ringer på fordøren - doublepress
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/german-shephard.mp3
media_content_type: audio/mpeg
metadata:
title: german-shephard.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "SSS" }}' value_template: '{{ trigger.payload_json.event == "SSS" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på fordøren - triple-press - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: - service: script.spil_paa_lille_bad
message: Det ringer på fordøren - triple-press
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data: data:
volume_level: 0.5 lydfil: dog-barking-2-bullmastiff.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
target: target:
entity_id: media_player.lille_badevaerelse entity_id: tts.google_ai_tts
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data: data:
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3 media_player_entity_id: media_player.alrum
media_content_type: audio/mpeg message: "Der er nogen der ringer på fordøren"
metadata: - sequence:
title: dog-barking-2-bullmastiff.mp3 - service: notify.mobile_app_claus_iphone_15pro
thumbnail: data:
media_class: music message: Det ringer på fordøren - triple-press
children_media_class: - service: notify.mobile_app_annes_iphone_14_pro
navigateIds: data:
- {} message: Det ringer på fordøren - triple-press
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/dog-barking-2-bullmastiff.mp3
media_content_type: audio/mpeg
metadata:
title: dog-barking-2-bullmastiff.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
- conditions: - conditions:
- condition: template - condition: template
value_template: '{{ trigger.payload_json.event == "L" }}' value_template: '{{ trigger.payload_json.event == "L" }}'
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - parallel:
data: - sequence:
message: Det ringer på fordøren - long-press - variables:
- service: notify.mobile_app_annes_iphone_14_pro lille_bad_volumen: "{{ 0.5 if (now().hour >= 20 or now().hour < 6) else 0.8 }}"
data: - service: script.spil_paa_lille_bad
message: Det ringer på fordøren - long-press
- choose:
- conditions:
- condition: time
after: '20:00:00'
before: 06:00:00
weekday:
- mon
- tue
- wed
- thu
- fri
- sat
- sun
sequence:
- service: media_player.volume_set
data: data:
volume_level: 0.5 lydfil: two-tone-chime.mp3
volumen: "{{ lille_bad_volumen }}"
- sequence:
- service: tts.speak
target: target:
entity_id: media_player.lille_badevaerelse entity_id: tts.google_ai_tts
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data: data:
media_content_id: media-source://media_source/local/two-tone-chime.mp3 media_player_entity_id: media_player.alrum
media_content_type: audio/mpeg message: "Der er nogen der ringer på fordøren"
metadata: - sequence:
title: two-tone-chime.mp3 - service: notify.mobile_app_claus_iphone_15pro
thumbnail: data:
media_class: music message: Det ringer på fordøren - long-press
children_media_class: - service: notify.mobile_app_annes_iphone_14_pro
navigateIds: data:
- {} message: Det ringer på fordøren - long-press
- media_content_type: app
media_content_id: media-source://media_source
default:
- service: media_player.volume_set
data:
volume_level: 0.8
target:
entity_id: media_player.lille_badevaerelse
- service: media_player.play_media
target:
entity_id: media_player.lille_badevaerelse
data:
media_content_id: media-source://media_source/local/two-tone-chime.mp3
media_content_type: audio/mpeg
metadata:
title: two-tone-chime.mp3
thumbnail:
media_class: music
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://media_source
- service: media_player.play_media
target:
entity_id: media_player.alrum
data:
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
media_content_type: provider
metadata:
title: 'der er nogen der ringer på
'
thumbnail: https://brands.home-assistant.io/_/google_translate/logo.png
media_class: app
children_media_class:
navigateIds:
- {}
- media_content_type: app
media_content_id: media-source://tts
- media_content_type: provider
media_content_id: media-source://tts/google_translate?message=der+er+nogen+der+ringer+p%C3%A5%0A
mode: single mode: single
trigger_variables: trigger_variables:
+12 -9
View File
@@ -4,16 +4,16 @@
trigger: trigger:
- platform: state - platform: state
entity_id: cover.anne entity_id: binary_sensor.garageport
to: "open" to: "on"
- platform: time - platform: time
at: "21:00:00" at: "21:00:00"
condition: condition:
- condition: state - condition: state
entity_id: cover.anne entity_id: binary_sensor.garageport
state: "open" state: "on"
action: action:
- delay: "00:05:00" - delay: "00:05:00"
@@ -21,8 +21,8 @@
- repeat: - repeat:
while: while:
- condition: state - condition: state
entity_id: cover.anne entity_id: binary_sensor.garageport
state: "open" state: "on"
sequence: sequence:
@@ -51,8 +51,8 @@
action: IGNORE_GARAGE_ANNE action: IGNORE_GARAGE_ANNE
- platform: state - platform: state
entity_id: cover.anne entity_id: binary_sensor.garageport
to: "closed" to: "off"
timeout: "00:30:00" timeout: "00:30:00"
@@ -62,7 +62,10 @@
- condition: template - condition: template
value_template: "{{ wait.trigger.event.data.action == 'CLOSE_GARAGE_ANNE' }}" value_template: "{{ wait.trigger.event.data.action == 'CLOSE_GARAGE_ANNE' }}"
sequence: sequence:
- service: cover.close_cover - condition: state
entity_id: binary_sensor.garageport
state: "on"
- service: cover.toggle
target: target:
entity_id: cover.anne entity_id: cover.anne
- stop: "Garage lukket via notifikation" - stop: "Garage lukket via notifikation"
+1
View File
@@ -14,6 +14,7 @@
data: data:
group_members: group_members:
- media_player.badevaerelse - media_player.badevaerelse
- media_player.lille_badevaerelse
- media_player.sovevaerelse - media_player.sovevaerelse
- media_player.stue - media_player.stue
- media_player.alrum - media_player.alrum
@@ -0,0 +1,53 @@
- alias: Infrastruktur - MQTT broker nede efter opstart
id: infrastructure_mqtt_broker_down_after_start
trigger:
- platform: homeassistant
event: start
action:
- delay: "00:03:00"
- condition: state
entity_id: binary_sensor.mqtt_broker_tcp
state: "off"
- service: persistent_notification.create
data:
title: "MQTT broker er nede"
message: >-
MQTT-brokeren svarer ikke efter Home Assistant-opstart.
Dørklokker og andre MQTT-afhængige funktioner virker derfor ikke.
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Home Assistant: MQTT broker nede"
message: "MQTT-brokeren svarer ikke efter opstart. Tjek Synology-containere."
- service: notify.mobile_app_annes_iphone_14_pro
data:
title: "Home Assistant: MQTT broker nede"
message: "MQTT-brokeren svarer ikke efter opstart. Tjek Synology-containere."
mode: single
- alias: Infrastruktur - MQTT broker gik ned
id: infrastructure_mqtt_broker_down_runtime
trigger:
- platform: state
entity_id: binary_sensor.mqtt_broker_tcp
to: "off"
for: "00:02:00"
action:
- service: persistent_notification.create
data:
title: "MQTT broker er nede"
message: >-
MQTT-brokeren har været utilgængelig i mindst 2 minutter.
Dørklokker og andre MQTT-afhængige funktioner virker derfor ikke.
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Home Assistant: MQTT broker nede"
message: "MQTT-brokeren har været nede i mindst 2 minutter. Tjek Synology-containere."
- service: notify.mobile_app_annes_iphone_14_pro
data:
title: "Home Assistant: MQTT broker nede"
message: "MQTT-brokeren har været nede i mindst 2 minutter. Tjek Synology-containere."
mode: single
@@ -0,0 +1,26 @@
- id: ingen_hjemme_sluk_lys_og_sonos
alias: "Ingen hjemme - sluk lys og Sonos"
mode: single
trigger:
- platform: state
entity_id: binary_sensor.family_presence
to: "off"
for:
minutes: 2
action:
- service: light.turn_off
target:
entity_id: light.indendorslamper
- service: media_player.media_stop
target:
entity_id:
- media_player.stue
- media_player.andreas
- media_player.daniel
- media_player.kokken
- media_player.alrum
- media_player.badevaerelse
- media_player.sovevaerelse
- media_player.lille_badevaerelse
- media_player.kontor
+10
View File
@@ -10,6 +10,8 @@
- condition: state # from sunset until sunrise - condition: state # from sunset until sunrise
entity_id: sun.sun entity_id: sun.sun
state: 'below_horizon' state: 'below_horizon'
- condition: template # Vintersæson uge 42-8
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
action: action:
- service: light.turn_on - service: light.turn_on
data: data:
@@ -19,6 +21,9 @@
trigger: trigger:
platform: sun platform: sun
event: sunrise event: sunrise
condition:
- condition: template # Vintersæson uge 42-8
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
action: action:
- service: light.turn_off - service: light.turn_off
data: data:
@@ -31,6 +36,8 @@
condition: condition:
- condition: time - condition: time
before: '21:30:00' before: '21:30:00'
- condition: template # Vintersæson uge 42-8
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
action: action:
- service: light.turn_on - service: light.turn_on
data: data:
@@ -40,6 +47,9 @@
trigger: trigger:
platform: time platform: time
at: "22:00:00" at: "22:00:00"
condition:
- condition: template # Vintersæson uge 42-8
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
action: action:
- service: light.turn_off - service: light.turn_off
data: data:
+4
View File
@@ -40,6 +40,10 @@
{{ 1000 <= t <= 2030 }} {{ 1000 <= t <= 2030 }}
{% endif %} {% endif %}
# Ikke syg
- condition: template
value_template: "{{ not is_state('input_select.andreas_status', 'syg') }}"
sequence: sequence:
- service: light.turn_on - service: light.turn_on
+126 -2
View File
@@ -1,3 +1,27 @@
- id: badevaerelse_startup_sluk
alias: Badeværelse lys sluk ved HA opstart
description: >
Slukker badeværelsets lys ved genstart hvis bevægelsessensoren er inaktiv.
Sikrer mod lys der sidder tændt efter strømudfald eller HA-genstart.
mode: single
trigger:
- platform: homeassistant
event: start
action:
- delay:
seconds: 30
- condition: state
entity_id: binary_sensor.badevaerelse_bevaegelse
state: "off"
- service: light.turn_off
target:
area_id: badevaerelse
- service: input_boolean.turn_off
target:
entity_id: input_boolean.badevaerelse_manuel_tilstand
- id: badevaerelse_motion_lys - id: badevaerelse_motion_lys
alias: Badeværelse lys via bevægelse alias: Badeværelse lys via bevægelse
mode: restart mode: restart
@@ -7,6 +31,12 @@
entity_id: binary_sensor.badevaerelse_bevaegelse entity_id: binary_sensor.badevaerelse_bevaegelse
to: "on" to: "on"
condition:
# Spring over hvis manuel tilstand er aktiv Hue-knap styrer lyset
- condition: state
entity_id: input_boolean.badevaerelse_manuel_tilstand
state: "off"
action: action:
- choose: - choose:
# Arbejdsdag dagtid (06:0022:00) # Arbejdsdag dagtid (06:0022:00)
@@ -49,10 +79,104 @@
- platform: state - platform: state
entity_id: binary_sensor.badevaerelse_bevaegelse entity_id: binary_sensor.badevaerelse_bevaegelse
to: "off" to: "off"
for:
minutes: 3 # Standard nat-timeout, kan ændres til 10 for dag, osv. variables:
is_dag: >
{% set t = now().strftime('%H%M') | int %}
{% if is_state('binary_sensor.arbejdsdag', 'on') %}
{{ 600 <= t < 2200 }}
{% else %}
{{ 800 <= t < 2200 }}
{% endif %}
action: action:
- delay:
minutes: >
{% if is_state('input_boolean.badevaerelse_manuel_tilstand', 'on') %}
10
{% elif is_dag %}
{{ states('input_number.badevaerelse_timeout_day') | int }}
{% else %}
{{ states('input_number.badevaerelse_timeout_night') | int }}
{% endif %}
- condition: state
entity_id: binary_sensor.badevaerelse_bevaegelse
state: "off"
- service: light.turn_off - service: light.turn_off
target: target:
area_id: badevaerelse area_id: badevaerelse
- service: input_boolean.turn_off
target:
entity_id: input_boolean.badevaerelse_manuel_tilstand
- id: badevaerelse_hue_knap
alias: Badeværelse Hue knap
description: >
Hue Tap Switch sætter manuel tilstand og tænder valgt scene.
Bevægelses-automatik springes over så længe manuel tilstand er aktiv.
Knap 4 slukker lyset og nulstiller til automatisk styring.
mode: restart
trigger:
- platform: state
entity_id: event.hue_tap_switch_1_button_1
id: knap_1
- platform: state
entity_id: event.hue_tap_switch_1_button_2
id: knap_2
- platform: state
entity_id: event.hue_tap_switch_1_button_3
id: knap_3
- platform: state
entity_id: event.hue_tap_switch_1_button_4
id: knap_4
action:
- choose:
# Knap 1 Nat/dæmpet lys
- conditions:
- condition: trigger
id: knap_1
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.badevaerelse_manuel_tilstand
- service: scene.turn_on
target:
entity_id: scene.badevaerelse_nat_2_lys
# Knap 2 Fuld lys (klar til brug)
- conditions:
- condition: trigger
id: knap_2
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.badevaerelse_manuel_tilstand
- service: scene.turn_on
target:
entity_id: scene.badevaerelse_klar
# Knap 3 Blomstrende forår (medium)
- conditions:
- condition: trigger
id: knap_3
sequence:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.badevaerelse_manuel_tilstand
- service: scene.turn_on
target:
entity_id: scene.badevaerelse_blomstrende_forar
# Knap 4 Sluk lys + nulstil til automatisk
- conditions:
- condition: trigger
id: knap_4
sequence:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.badevaerelse_manuel_tilstand
- service: light.turn_off
target:
area_id: badevaerelse
+53 -87
View File
@@ -1,94 +1,60 @@
# - alias: 'Lys Daniel dag - arbejdsdag - sunrise' - id: daniel_motion_lys
# trigger: alias: Daniel lys via bevaegelse
# platform: time mode: restart
# at: '06:00:00'
# condition:
# - condition: state
# entity_id: binary_sensor.arbejdsdag
# state: 'on'
# action:
# - service: script.sunrise
trigger:
- alias: 'Lys Daniel dag - arbejdsdag' - platform: state
trigger:
platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion entity_id: binary_sensor.hue_motion_sensor_2_motion
to: 'on' to: "on"
condition: id: motion_on
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_2_illuminance
below: 90
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
- condition: time
after: '06:30:00'
before: '19:30:00'
action:
- service: homeassistant.turn_on
target:
entity_id: light.daniels_vaerelse
data:
brightness_pct: 100
- alias: 'Lys Daniel dag - ikke arbejdsdag' - platform: state
trigger:
platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion entity_id: binary_sensor.hue_motion_sensor_2_motion
to: 'on' to: "off"
condition: id: motion_off
- condition: numeric_state
entity_id: sensor.hue_motion_sensor_2_illuminance
below: 90
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
- condition: time
after: '10:00:00'
before: '19:45:00'
action:
- service: homeassistant.turn_on
target:
entity_id: light.daniels_vaerelse
data:
brightness_pct: 100
# - alias: 'Lys Daniel aften'
# trigger:
# platform: state
# entity_id: binary_sensor.hue_motion_sensor_2_motion
# to: 'on'
# condition:
# - condition: numeric_state
# entity_id: sensor.hue_motion_sensor_2_illuminance
# below: 90
# - condition: time
# after: '20:00:01'
# before: '21:00:00'
# action:
# - service: homeassistant.turn_on
# target:
# entity_id: light.daniels_vaerelse
# data:
# brightness_pct: 50
variables:
lux_limit: "{{ states('input_number.daniel_lux_threshold') | int }}"
brightness: "{{ states('input_number.daniel_brightness') | int }}"
timeout: "{{ states('input_number.daniel_timeout') | int }}"
- alias: 'Sluk lys i Daniel' action:
trigger: - choose:
platform: state
entity_id: binary_sensor.hue_motion_sensor_2_motion
to: 'off'
for:
minutes: 10
condition:
- condition: time
after: '05:00:00'
before: '22:00:00'
action:
- service: homeassistant.turn_off
data:
entity_id:
- light.daniels_vaerelse
# Motion on: taend lys hvis lux lavt og indenfor tidsvindue
- conditions:
- condition: trigger
id: motion_on
- condition: template
value_template: >
{{ states('sensor.hue_motion_sensor_2_illuminance') | int < lux_limit }}
- condition: template
value_template: >
{% set t = now().strftime('%H%M') | int %}
{% if is_state('binary_sensor.arbejdsdag', 'on') %}
{{ 630 <= t < 1930 }}
{% else %}
{{ 1000 <= t < 1945 }}
{% endif %}
- condition: template
value_template: "{{ not is_state('input_select.daniel_status', 'syg') }}"
sequence:
- service: light.turn_on
target:
entity_id: light.daniels_vaerelse
data:
brightness_pct: "{{ brightness }}"
# Motion off: vent timeout, sluk hvis stadig ingen bevaegelse
- conditions:
- condition: trigger
id: motion_off
sequence:
- delay:
minutes: "{{ timeout }}"
- condition: state
entity_id: binary_sensor.hue_motion_sensor_2_motion
state: "off"
- service: light.turn_off
target:
entity_id: light.daniels_vaerelse
+62 -165
View File
@@ -1,171 +1,68 @@
- alias: 'Lys i gang - arbejdsdag - dag' - id: gang_motion_lys
trigger: alias: Gang lys via bevægelse
platform: state mode: restart
entity_id: binary_sensor.gang_sensor_motion
to: 'on'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
- condition: numeric_state
entity_id: sensor.gang_sensor_illuminance
below: '70'
- condition: time
before: '21:30:00'
- condition: time
after: '06:30:00'
action:
- service: scene.turn_on
data:
entity_id: scene.gang_bright
# brightness: 255
# color_temp: 396
- alias: 'Sluk Lys i gang - arbejdsdag - dag'
trigger:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: 'off'
for:
minutes: 3
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
- condition: time
after: '06:30:10'
- condition: time
before: '21:30:00'
action:
service: light.turn_off
data:
entity_id: light.gang_2
- alias: 'Lys i gang - ikke arbejdsdag - dag' trigger:
trigger: - platform: state
platform: state
entity_id: binary_sensor.gang_sensor_motion entity_id: binary_sensor.gang_sensor_motion
to: 'on' to: "on"
condition: id: motion_on
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
- condition: numeric_state
entity_id: sensor.gang_sensor_illuminance
below: 70
- condition: time
after: '08:00:00'
- condition: time
before: '22:00:00'
action:
- service: scene.turn_on
data:
entity_id: scene.gang_bright
# brightness: 255
# color_temp: 396
- alias: 'Sluk Lys i gang - ikke arbejdsdag - dag'
trigger:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: 'off'
for:
minutes: 3
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
- condition: time
after: '08:00:10'
- condition: time
before: '22:00:00'
action:
service: light.turn_off
data:
entity_id: light.gang_2
########## NIGHT - platform: state
entity_id: binary_sensor.gang_sensor_motion
to: "off"
id: motion_off
- alias: 'Lys i gang - arbejdsdag - nat' variables:
trigger: lux_limit: "{{ states('input_number.gang_lux_threshold') | int }}"
platform: state is_dag: >
entity_id: binary_sensor.gang_sensor_motion {% set t = now().strftime('%H%M') | int %}
to: 'on' {% if is_state('binary_sensor.arbejdsdag', 'on') %}
condition: {{ 630 <= t < 2130 }}
- condition: state {% else %}
entity_id: binary_sensor.arbejdsdag {{ 800 <= t < 2200 }}
state: 'on' {% endif %}
- condition: numeric_state
entity_id: sensor.gang_sensor_illuminance
below: '70'
- condition: time
before: '06:30:00'
after: '21:30:00'
action:
- service: scene.turn_on
data:
entity_id: scene.gang_daempet_nat
# brightness_pct: 1
# color_temp: 396
- alias: 'Sluk Lys i gang - arbejdsdag - nat'
trigger:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: 'off'
for:
minutes: 1
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
- condition: time
after: '21:30:10'
before: '06:30:00'
action:
service: light.turn_off
data:
entity_id: light.gang_2
- alias: 'Lys i gang - ikke arbejdsdag - nat' action:
trigger: - choose:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: 'on'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
# - condition: numeric_state
# entity_id: sensor.gang_sensor_light_level
# below: '70'
- condition: time
after: '22:00:00'
before: '08:00:00'
action:
- service: scene.turn_on
data:
entity_id: scene.gang_daempet_nat
# brightness_pct: 1
# color_temp: 396
- alias: 'Sluk Lys i gang - ikke arbejdsdag - nat'
trigger:
platform: state
entity_id: binary_sensor.gang_sensor_motion
to: 'off'
for:
minutes: 1
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'off'
- condition: time
after: '22:00:10'
before: '08:00:00'
action:
- service: light.turn_off
data:
entity_id: light.gang_2
# Motion on - dag: taend bright scene hvis lux er lavt nok
- conditions:
- condition: trigger
id: motion_on
- condition: template
value_template: "{{ is_dag }}"
- condition: template
value_template: >
{{ states('sensor.gang_sensor_illuminance') | int < lux_limit }}
sequence:
- service: scene.turn_on
target:
entity_id: scene.gang_bright
# Motion on - nat: taend daempet scene (ingen lux-check)
- conditions:
- condition: trigger
id: motion_on
- condition: template
value_template: "{{ not is_dag }}"
sequence:
- service: scene.turn_on
target:
entity_id: scene.gang_daempet_nat
# Motion off: vent timeout, sluk hvis stadig ingen bevaegelse
- conditions:
- condition: trigger
id: motion_off
sequence:
- delay:
minutes: >
{{ states('input_number.gang_timeout_day') | int if is_dag
else states('input_number.gang_timeout_night') | int }}
- condition: state
entity_id: binary_sensor.gang_sensor_motion
state: "off"
- service: light.turn_off
target:
entity_id: light.gang
+4 -4
View File
@@ -26,8 +26,8 @@
- alias: 'Lys Garage - tænd hvis garage åbner' - alias: 'Lys Garage - tænd hvis garage åbner'
trigger: trigger:
platform: state platform: state
entity_id: cover.anne entity_id: binary_sensor.garageport
to: 'open' to: 'on'
action: action:
- service: scene.turn_on - service: scene.turn_on
data: data:
@@ -36,8 +36,8 @@
- alias: 'Sluk lys garage 5 min efter lukning' - alias: 'Sluk lys garage 5 min efter lukning'
trigger: trigger:
platform: state platform: state
entity_id: cover.anne entity_id: binary_sensor.garageport
to: 'closed' to: 'off'
for: for:
minutes: 5 minutes: 5
action: action:
+8 -5
View File
@@ -8,9 +8,10 @@
to: "on" to: "on"
condition: condition:
- condition: numeric_state - condition: template
entity_id: sensor.kontor_belysningsstyrke value_template: >
below: 60 {{ states('sensor.kontor_belysningsstyrke') | int <
states('input_number.kontor_lux_threshold') | int }}
action: action:
- service: scene.turn_on - service: scene.turn_on
@@ -36,7 +37,8 @@
- platform: state - platform: state
entity_id: binary_sensor.kontor_motion_bevaegelse entity_id: binary_sensor.kontor_motion_bevaegelse
to: "on" to: "on"
timeout: "00:10:00" timeout:
minutes: "{{ states('input_number.kontor_timeout_day') | int }}"
continue_on_timeout: true continue_on_timeout: true
- condition: state - condition: state
entity_id: binary_sensor.kontor_motion_bevaegelse entity_id: binary_sensor.kontor_motion_bevaegelse
@@ -67,7 +69,8 @@
- platform: state - platform: state
entity_id: binary_sensor.kontor_motion_bevaegelse entity_id: binary_sensor.kontor_motion_bevaegelse
to: "on" to: "on"
timeout: "00:05:00" timeout:
minutes: "{{ states('input_number.kontor_timeout_night') | int }}"
continue_on_timeout: true continue_on_timeout: true
- condition: state - condition: state
entity_id: binary_sensor.kontor_motion_bevaegelse entity_id: binary_sensor.kontor_motion_bevaegelse
+15
View File
@@ -6,6 +6,10 @@
- condition: state - condition: state
entity_id: binary_sensor.arbejdsdag entity_id: binary_sensor.arbejdsdag
state: 'on' state: 'on'
- condition: template
value_template: >-
{{ not is_state('input_select.anne_status', 'syg') and
not is_state('input_select.claus_status', 'syg') }}
action: action:
- service: script.sunrise - service: script.sunrise
@@ -25,6 +29,10 @@
- condition: time - condition: time
after: '06:30:00' after: '06:30:00'
before: '20:00:00' before: '20:00:00'
- condition: template
value_template: >-
{{ not is_state('input_select.anne_status', 'syg') and
not is_state('input_select.claus_status', 'syg') }}
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
target: target:
@@ -47,6 +55,10 @@
- condition: time - condition: time
after: '10:00:00' after: '10:00:00'
before: '20:00:00' before: '20:00:00'
- condition: template
value_template: >-
{{ not is_state('input_select.anne_status', 'syg') and
not is_state('input_select.claus_status', 'syg') }}
action: action:
- service: homeassistant.turn_on - service: homeassistant.turn_on
target: target:
@@ -161,6 +173,9 @@
- condition: time - condition: time
after: '06:30:00' after: '06:30:00'
before: '22:00:00' before: '22:00:00'
- condition: state
entity_id: script.godnat_sovevaerelse
state: 'off'
action: action:
- service: homeassistant.turn_off - service: homeassistant.turn_off
data: data:
+121 -140
View File
@@ -1,157 +1,138 @@
- id: stue_motion_lys - id: stue_motion_lys
alias: Stue lys via bevægelse alias: Stue lys via bevaegelse
mode: restart mode: restart
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.stue_bevaegelse entity_id: binary_sensor.stue_bevaegelse
to: "on" to: "on"
id: motion_on
condition: - platform: state
- condition: numeric_state entity_id: binary_sensor.stue_bevaegelse
entity_id: sensor.stue_belysningsstyrke to: "off"
below: 60 id: motion_off
- platform: state
entity_id: media_player.samsung_s95ca_55_3
to: "off"
id: tv_off
variables:
lux_limit: "{{ states('input_number.stue_lux_threshold') | int }}"
dagperiode: >
{% set t = now().strftime('%H%M') | int %}
{% if 600 <= t < 1600 %}morgen
{% elif 1600 <= t < 1900 %}eftermiddag
{% elif 1900 <= t < 2100 %}aften_lys
{% elif 2100 <= t %}aften
{% else %}nat{% endif %}
timeout_min: >
{% set t = now().strftime('%H%M') | int %}
{% if 600 <= t < 1600 %}
{{ states('input_number.stue_timeout_morgen') | int }}
{% elif 1600 <= t < 1900 %}
{{ states('input_number.stue_timeout_eftermiddag') | int }}
{% elif 1900 <= t < 2100 %}
{{ states('input_number.stue_timeout_aften') | int }}
{% elif 2100 <= t %}
{{ states('input_number.stue_timeout_aften') | int }}
{% else %}
{{ states('input_number.stue_timeout_nat') | int }}
{% endif %}
action: action:
- choose: - choose:
# Motion on: taend lys hvis lux lavt
- conditions: - conditions:
- condition: time - condition: trigger
after: "06:00:00" id: motion_on
before: "16:00:00" - condition: template
value_template: >
{{ states('sensor.stue_belysningsstyrke') | int < lux_limit }}
sequence: sequence:
- service: scene.turn_on - choose:
target: # Gæster: altid Annes favorit uanset tidspunkt
entity_id: scene.stue_bright - conditions:
- condition: state
entity_id: input_boolean.gaester
state: "on"
sequence:
- service: scene.turn_on
target:
entity_id: scene.stue_annes_favorit
- conditions:
- condition: template
value_template: "{{ dagperiode == 'morgen' }}"
sequence:
- service: scene.turn_on
target:
entity_id: scene.stue_bright
- conditions:
- condition: template
value_template: "{{ dagperiode == 'eftermiddag' }}"
sequence:
- service: scene.turn_on
target:
entity_id: scene.stue_annes_favorit
- conditions:
- condition: template
value_template: "{{ dagperiode == 'aften_lys' }}"
sequence:
- service: scene.turn_on
target:
entity_id: scene.stue_annes_favorit
- conditions:
- condition: template
value_template: "{{ dagperiode == 'aften' }}"
sequence:
- service: scene.turn_on
target:
entity_id: scene.stue_annes_favorit
default:
- service: scene.turn_on
target:
entity_id: scene.stue_relax_minus_syd
# Motion off: vent timeout, sluk hvis stadig ingen bevaegelse
# Aften: springer over hvis TV er taendt (TV-off trigger haandterer det)
- conditions: - conditions:
- condition: time - condition: trigger
after: "16:00:00" id: motion_off
before: "22:00:00" - condition: template
value_template: >
{{ dagperiode not in ('aften','aften_lys') or
is_state('media_player.samsung_s95ca_55_3', 'off') }}
sequence: sequence:
- service: scene.turn_on - delay:
minutes: "{{ timeout_min }}"
- condition: state
entity_id: binary_sensor.stue_bevaegelse
state: "off"
- condition: template
value_template: >
{{ dagperiode not in ('aften','aften_lys') or
is_state('media_player.samsung_s95ca_55_3', 'off') }}
- service: light.turn_off
target: target:
entity_id: scene.stue_annes_favorit entity_id: light.livingroom
default:
- service: scene.turn_on
target:
entity_id: scene.stue_relax_minus_syd
- id: stue_motion_sluk_morgen # TV slukket om aftenen: vent 10 min, sluk hvis ingen bevaegelse
alias: Sluk stue lys efter 60 min uden bevægelse om morgenen - conditions:
mode: restart - condition: trigger
id: tv_off
trigger: - condition: template
- platform: state value_template: "{{ dagperiode in ('aften','aften_lys') }}"
entity_id: binary_sensor.stue_bevaegelse sequence:
to: "off" - delay:
minutes: "{{ timeout_min }}"
condition: - condition: state
- condition: time entity_id: binary_sensor.stue_bevaegelse
after: "06:00:00" state: "off"
before: "16:00:00" - condition: state
entity_id: media_player.samsung_s95ca_55_3
action: state: "off"
- wait_for_trigger: - service: light.turn_off
- platform: state target:
entity_id: binary_sensor.stue_bevaegelse entity_id: light.livingroom
to: "on"
timeout: "01:00:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.stue_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.livingroom
- id: stue_motion_sluk_eftermiddag_aften
alias: Sluk stue lys efter 120 min uden bevægelse mellem 16 og 19
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "off"
condition:
- condition: time
after: "16:00:00"
before: "19:00:00"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "on"
timeout: "02:00:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.stue_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.livingroom
- id: stue_motion_sluk_aften_tv
alias: Sluk stue lys efter 10 min uden bevægelse når TV er slukket mellem 19 og 00
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "off"
- platform: state
entity_id: media_player.samsung_s95ca_55_3
to: "off"
condition:
- condition: time
after: "19:00:00"
before: "00:00:00"
action:
- condition: state
entity_id: media_player.samsung_s95ca_55_3
state: "off"
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "on"
timeout: "00:10:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.stue_bevaegelse
state: "off"
- condition: state
entity_id: media_player.samsung_s95ca_55_3
state: "off"
- service: light.turn_off
target:
entity_id: light.livingroom
- id: stue_motion_sluk_nat
alias: Sluk stue lys efter 30 min uden bevægelse om natten
mode: restart
trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "off"
condition:
- condition: time
after: "00:00:00"
before: "06:00:00"
action:
- wait_for_trigger:
- platform: state
entity_id: binary_sensor.stue_bevaegelse
to: "on"
timeout: "00:30:00"
continue_on_timeout: true
- condition: state
entity_id: binary_sensor.stue_bevaegelse
state: "off"
- service: light.turn_off
target:
entity_id: light.livingroom
+21 -3
View File
@@ -16,6 +16,9 @@
- service: scene.turn_on - service: scene.turn_on
data: data:
entity_id: scene.indkorsel_bright entity_id: scene.indkorsel_bright
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- alias: 'Sluk lys indkørsel når der er lys nok' - alias: 'Sluk lys indkørsel når der er lys nok'
trigger: trigger:
@@ -30,6 +33,9 @@
- service: light.turn_off - service: light.turn_off
data: data:
entity_id: light.indkorsel_2 entity_id: light.indkorsel_2
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
- alias: 'Tænd lys indkørsel aften' - alias: 'Tænd lys indkørsel aften'
trigger: trigger:
@@ -43,6 +49,9 @@
- service: scene.turn_on - service: scene.turn_on
data: data:
entity_id: scene.indkorsel_bright entity_id: scene.indkorsel_bright
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- alias: 'Sluk lys indkørsel aften' - alias: 'Sluk lys indkørsel aften'
trigger: trigger:
@@ -52,6 +61,9 @@
- service: light.turn_off - service: light.turn_off
data: data:
entity_id: light.indkorsel_2 entity_id: light.indkorsel_2
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
- alias: 'Tænd lys indkørsel ved bevægelse' - alias: 'Tænd lys indkørsel ved bevægelse'
@@ -78,6 +90,9 @@
- service: scene.turn_on - service: scene.turn_on
data: data:
entity_id: scene.indkorsel_bright entity_id: scene.indkorsel_bright
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- alias: 'Sluk lys indkørsel 15 min efter bevægelse' - alias: 'Sluk lys indkørsel 15 min efter bevægelse'
trigger: trigger:
@@ -97,8 +112,11 @@
# entity_id: sun.sun # entity_id: sun.sun
# state: below_horizon # state: below_horizon
action: action:
service: light.turn_off - service: light.turn_off
data: data:
entity_id: light.indkorsel_2 entity_id: light.indkorsel_2
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
+13 -7
View File
@@ -19,7 +19,10 @@
entity_id: entity_id:
- light.drivhus - light.drivhus
- light.paradis - light.paradis
- light.extended_color_light_1 - condition: template
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
- service: homeassistant.turn_on
entity_id: light.extended_color_light_1
- alias: 'Sluk lys ved garage' - alias: 'Sluk lys ved garage'
trigger: trigger:
@@ -29,12 +32,15 @@
for: for:
minutes: 10 minutes: 10
action: action:
service: homeassistant.turn_off - service: homeassistant.turn_off
data: data:
entity_id: entity_id:
- light.drivhus - light.drivhus
- light.paradis - light.paradis
- light.extended_color_light_1 - condition: template
value_template: "{{ now().isocalendar()[1] >= 42 or now().isocalendar()[1] <= 8 }}"
- service: homeassistant.turn_off
entity_id: light.extended_color_light_1
+22
View File
@@ -0,0 +1,22 @@
- id: mealie_generate_bilka_checklist_wednesday
alias: "Mealie indkøbsliste - onsdag morgen"
trigger:
- platform: time
at: "06:30:00"
condition:
- condition: time
weekday:
- wed
action:
- service: script.mealie_shopping_refresh
- id: mealie_update_mealplan
alias: "Mealie opdater madplan"
trigger:
- platform: homeassistant
event: start
- platform: time_pattern
minutes: "/30"
action:
- service: shell_command.mealie_update
@@ -1,15 +1,32 @@
- id: garage_auto_claus_presence - id: garage_auto_claus_presence
alias: Garage auto Claus alias: Garage auto Claus
description: >
Åbn garage ved ankomst i bil, luk ved afrejse.
Bruger input_boolean.left_home_by_car til at huske at afrejsen var i bil,
så ankomst-logikken ikke afhænger af at Tesla-trackeren opdaterer hurtigt.
Leaving-trigger bruger garageport=on som bevis for bil (Tesla speed er for langsom).
trigger: trigger:
# Telefon ankommer hjem (debounce 10s mod GPS-flimmer)
- platform: state - platform: state
entity_id: device_tracker.claus_iphone_15pro entity_id: device_tracker.claus_iphone_15pro
to: "home" to: "home"
for:
seconds: 10
id: arriving id: arriving
# Bil ankommer hjem (backup hvis telefon allerede var "home" via WiFi)
- platform: state
entity_id: device_tracker.snowywhite_location_tracker
to: "home"
id: car_arriving
# Telefon forlader hjemmet (debounce 10s mod GPS-flimmer)
- platform: state - platform: state
entity_id: device_tracker.claus_iphone_15pro entity_id: device_tracker.claus_iphone_15pro
from: "home" from: "home"
for:
seconds: 10
id: leaving id: leaving
condition: condition:
@@ -20,49 +37,92 @@
action: action:
- choose: - choose:
# ÅBN (kun hvis bil er aktiv) # ÅBN via telefon: garage lukket + forlod hjemmet i bil
- conditions: - conditions:
- condition: trigger - condition: trigger
id: arriving id: arriving
- condition: state - condition: state
entity_id: cover.anne entity_id: binary_sensor.garageport
state: "closed" state: "off"
- condition: template # Vi ved at brugeren kørte hjemmefra
value_template: > - condition: state
{{ state_attr('device_tracker.snowywhite_location_tracker', 'speed') not in [None, 'unknown'] }} entity_id: input_boolean.left_home_by_car
state: "on"
sequence: sequence:
- service: cover.open_cover - service: cover.toggle
target: target:
entity_id: cover.anne entity_id: cover.anne
- service: input_boolean.turn_off
target:
entity_id: input_boolean.left_home_by_car
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
message: "Garage opened (arrival by car)" message: "Garage åbnet (ankomst i bil)"
# LUK (kun hvis bil er aktiv) # ÅBN via bil-tracker: telefon allerede hjemme + forlod i bil
- conditions:
- condition: trigger
id: car_arriving
- condition: state
entity_id: binary_sensor.garageport
state: "off"
- condition: state
entity_id: device_tracker.claus_iphone_15pro
state: "home"
- condition: state
entity_id: input_boolean.left_home_by_car
state: "on"
sequence:
- service: cover.toggle
target:
entity_id: cover.anne
- service: input_boolean.turn_off
target:
entity_id: input_boolean.left_home_by_car
- service: notify.mobile_app_claus_iphone_15pro
data:
message: "Garage åbnet (bil-tracker ankomst)"
# LUK: garage åben + forlader hjemmet => kører i bil
- conditions: - conditions:
- condition: trigger - condition: trigger
id: leaving id: leaving
- condition: state - condition: state
entity_id: cover.anne entity_id: binary_sensor.garageport
state: "open" state: "on"
- condition: template
value_template: >
{{ state_attr('device_tracker.snowywhite_location_tracker', 'speed') not in [None, 'unknown'] }}
sequence: sequence:
- delay: "00:00:20" # giver tid til at du faktisk er kørt ud # Markér at vi kørte hjemmefra (bruges ved ankomst)
- service: input_boolean.turn_on
target:
entity_id: input_boolean.left_home_by_car
- service: cover.close_cover - delay: "00:00:30"
# Dobbelttjek at garagen stadig er åben efter forsinkelsen
- condition: state
entity_id: binary_sensor.garageport
state: "on"
- service: cover.toggle
target: target:
entity_id: cover.anne entity_id: cover.anne
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
message: "Garage closed (departure by car)" message: "Garage lukket (afrejse i bil)"
mode: single mode: single
max_exceeded: silent
+71 -5
View File
@@ -94,19 +94,85 @@
trigger: trigger:
- platform: time_pattern - platform: time_pattern
minutes: "0" minutes: "/15"
condition: condition:
- condition: template - condition: template
value_template: "{{ now().hour >= 16 and now().hour <= 21 }}" value_template: "{{ now().hour >= 19 and now().hour <= 21 }}"
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_fjernbetjening entity_id: input_boolean.dishwasher_reminder_snoozed
state: "off" state: "off"
- condition: template - condition: template
value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}" value_template: "{{ is_state('sensor.dishwasher_status_2', 'Off') }}"
- condition: or
conditions:
- condition: state
entity_id: binary_sensor.dishwasher_fjernbetjening
state: "off"
- condition: template
value_template: "{{ not is_state('binary_sensor.dishwasher_dor', 'off') }}"
- condition: template
value_template: "{{ is_state('binary_sensor.dishwasher_info_2', 'on') }}"
- condition: template
value_template: "{{ is_state('binary_sensor.dishwasher_svigt', 'on') }}"
- condition: template
value_template: "{{ states('sensor.dishwasher_salt_level') | float(999) < 20 }}"
- condition: template
value_template: "{{ states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 }}"
- condition: template
value_template: "{{ states('sensor.dishwasher_powerdisk_level') | float(999) < 20 }}"
action: action:
- variables:
reminder_time: "{{ now().strftime('%H:%M') }}"
remote_off: "{{ is_state('binary_sensor.dishwasher_fjernbetjening', 'off') }}"
door_not_closed: "{{ not is_state('binary_sensor.dishwasher_dor', 'off') }}"
low_salt: "{{ states('sensor.dishwasher_salt_level') | float(999) < 20 }}"
low_rinse: "{{ states('sensor.dishwasher_rinse_aid_level') | float(999) < 20 }}"
low_powerdisk: "{{ states('sensor.dishwasher_powerdisk_level') | float(999) < 20 }}"
info_on: "{{ is_state('binary_sensor.dishwasher_info_2', 'on') }}"
svigt: "{{ is_state('binary_sensor.dishwasher_svigt', 'on') }}"
issue_text: >
{% set issues = [] %}
{% if remote_off %}{% set issues = issues + ['remote control er ikke slået til'] %}{% endif %}
{% if door_not_closed %}{% set issues = issues + ['døren er ikke lukket'] %}{% endif %}
{% if low_salt %}{% set issues = issues + ['salt er lavt (' ~ states('sensor.dishwasher_salt_level') ~ '%)'] %}{% endif %}
{% if low_rinse %}{% set issues = issues + ['afspændingsmiddel er lavt (' ~ states('sensor.dishwasher_rinse_aid_level') ~ '%)'] %}{% endif %}
{% if low_powerdisk %}{% set issues = issues + ['powerdisk er lav (' ~ states('sensor.dishwasher_powerdisk_level') ~ '%)'] %}{% endif %}
{% if info_on %}{% set issues = issues + ['info-advarsel aktiv'] %}{% endif %}
{% if svigt %}{% set issues = issues + ['maskinsvigt'] %}{% endif %}
{{ issues | join(', ') }}
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
title: "Slå fjernbetjening til på opvaskemaskinen" title: "⚠️ Opvaskemaskine - tjek inden natkørsel"
message: "Opvaskemaskinen er planlagt til natkørsel, men remote control er ikke slået til endnu." message: "[{{ reminder_time }}] {{ issue_text | capitalize }}."
data:
actions:
- action: "DISHWASHER_DONE"
title: "✅ Gjort det"
- action: "DISHWASHER_IGNORE"
title: "🔕 Ignorer i aften"
- id: dishwasher_reminder_action_ignore
alias: Opvaskemaskine - ignorer påmindelser i aften
mode: single
trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: DISHWASHER_IGNORE
action:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.dishwasher_reminder_snoozed
- id: dishwasher_reminder_snooze_reset
alias: Opvaskemaskine - nulstil snooze ved midnat
mode: single
trigger:
- platform: time
at: "00:00:00"
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.dishwasher_reminder_snoozed
+195
View File
@@ -0,0 +1,195 @@
- alias: 'Plæneklipper - opdater sidst klippet'
description: 'Opdater input_datetime når klipperen starter (uanset hvem der startede den)'
trigger:
- platform: state
entity_id: lawn_mower.husqvarna_automower
to: mowing
action:
- service: input_datetime.set_datetime
target:
entity_id: input_datetime.ploeneklipper_sidst_koert
data:
datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
- alias: 'Plæneklipper - start arbejdsdag'
description: 'Start plæneklipper kl 9 på arbejdsdage hvis det ikke regner og ingen er hjemme'
trigger:
- platform: time
at: '09:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
action:
- choose:
- conditions:
- condition: state
entity_id: binary_sensor.family_presence
state: 'on'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen startede IKKE kl. 9 - der er nogen hjemme."
- conditions:
- condition: or
conditions:
- condition: state
entity_id: weather.home
attribute: condition
state: 'rainy'
- condition: state
entity_id: weather.home
attribute: condition
state: 'pouring'
sequence:
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen startede IKKE kl. 9 - det regner."
default:
- service: lawn_mower.start_mowing
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er startet."
- alias: 'Plæneklipper - dock arbejdsdag'
description: 'Send plæneklipper hjem kl 13 på arbejdsdage'
trigger:
- platform: time
at: '13:00:00'
condition:
- condition: state
entity_id: binary_sensor.arbejdsdag
state: 'on'
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'mowing'
action:
- service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er sendt hjem (kl. 13 stop)."
- alias: 'Plæneklipper - stop ved regn'
description: 'Send plæneklipper hjem hvis det begynder at regne'
trigger:
- platform: state
entity_id: weather.home
attribute: condition
to: 'rainy'
- platform: state
entity_id: weather.home
attribute: condition
to: 'pouring'
condition:
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'mowing'
action:
- service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er sendt hjem - det begyndte at regne."
- alias: 'Plæneklipper - stop når nogen kommer hjem'
description: 'Send plæneklipper hjem når nogen ankommer'
trigger:
- platform: state
entity_id: binary_sensor.family_presence
to: 'on'
condition:
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'mowing'
- condition: state
entity_id: input_boolean.ploeneklipper_manuelt_startet
state: 'off'
action:
- service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er sendt hjem - {{ trigger.to_state.attributes.friendly_name }} kom hjem."
- alias: 'Plæneklipper - reset manuelt startet flag'
description: 'Nulstil manuelt-startet flag når klipperen dokker efter kl. 20 (i dagtimerne håndteres genstarten af genstart-automation)'
trigger:
- platform: state
entity_id: lawn_mower.husqvarna_automower
to: 'docked'
condition:
- condition: time
after: '20:00:00'
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.ploeneklipper_manuelt_startet
- alias: 'Plæneklipper - genstart efter opladning (manuelt startet)'
description: 'Genstart klipperen 75 min efter den er dokket, hvis den er manuelt startet og det er før kl. 20'
trigger:
- platform: state
entity_id: lawn_mower.husqvarna_automower
to: 'docked'
condition:
- condition: state
entity_id: input_boolean.ploeneklipper_manuelt_startet
state: 'on'
- condition: time
before: '20:00:00'
action:
- delay: '01:15:00'
- condition: state
entity_id: input_boolean.ploeneklipper_manuelt_startet
state: 'on'
- condition: time
before: '20:00:00'
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'docked'
- service: lawn_mower.start_mowing
target:
entity_id: lawn_mower.husqvarna_automower
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er genstartet efter opladning."
- alias: 'Plæneklipper - stop kl. 20 ved manuel start'
description: 'Stop manuelt startet klipper kl. 20 og nulstil flag'
trigger:
- platform: time
at: '20:00:00'
condition:
- condition: state
entity_id: input_boolean.ploeneklipper_manuelt_startet
state: 'on'
action:
- choose:
- conditions:
- condition: state
entity_id: lawn_mower.husqvarna_automower
state: 'mowing'
sequence:
- service: lawn_mower.dock
target:
entity_id: lawn_mower.husqvarna_automower
- service: input_boolean.turn_off
target:
entity_id: input_boolean.ploeneklipper_manuelt_startet
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "Plæneklipper"
message: "Klipperen er stoppet - kl. 20 grænse nået."
@@ -54,6 +54,10 @@
- delay: - delay:
seconds: "{{ range(30,180) | random }}" seconds: "{{ range(30,180) | random }}"
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- delay: - delay:
minutes: "{{ range(10,30) | random }}" minutes: "{{ range(10,30) | random }}"
@@ -66,6 +70,10 @@
- delay: - delay:
seconds: "{{ range(20,120) | random }}" seconds: "{{ range(20,120) | random }}"
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
- choose: - choose:
- conditions: - conditions:
- condition: template - condition: template
@@ -146,6 +154,10 @@
- delay: - delay:
seconds: "{{ range(20,120) | random }}" seconds: "{{ range(20,120) | random }}"
- service: switch.turn_on
data:
entity_id: switch.stik_indkorsel
- delay: - delay:
minutes: "{{ range(15,60) | random }}" minutes: "{{ range(15,60) | random }}"
@@ -158,6 +170,10 @@
- delay: - delay:
seconds: "{{ range(20,120) | random }}" seconds: "{{ range(20,120) | random }}"
- service: switch.turn_off
data:
entity_id: switch.stik_indkorsel
- choose: - choose:
- conditions: - conditions:
- condition: template - condition: template
+52 -14
View File
@@ -52,12 +52,26 @@
for: "00:05:00" for: "00:05:00"
variables: variables:
roborock_family_away: "{{ is_state('binary_sensor.family_presence', 'off') }}" roborock_cleaned_area: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaned_area') | default('ukendt', true) }}"
roborock_auto_runs: "{{ states('input_number.roborock_auto_runs_today') | int(0) }}" roborock_cleaning_time: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaning_time') | default('ukendt', true) }}"
roborock_is_cleaning: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
roborock_battery: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'battery_level') | int(0) }}"
action: action:
# Vent til Roborock er vækket og rapporterer tilstand
- wait_template: >
{{ states('vacuum.roborock_s8_pro_ultra') not in ['unknown', 'unavailable']
and states('sensor.roborock_s8_pro_ultra_batteri') not in ['unknown', 'unavailable'] }}
timeout: "00:02:00"
# Genberegn variabler EFTER Roborock er vågnet
- variables:
roborock_family_away: "{{ is_state('binary_sensor.family_presence', 'off') }}"
roborock_auto_runs: "{{ states('input_number.roborock_auto_runs_today') | int(0) }}"
roborock_is_cleaning: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
roborock_battery: "{{ states('sensor.roborock_s8_pro_ultra_batteri') | int(0) }}"
roborock_state: "{{ states('vacuum.roborock_s8_pro_ultra') }}"
roborock_status: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'status') | default('ukendt', true) }}"
roborock_error: "{{ state_attr('vacuum.roborock_s8_pro_ultra', 'error') | default('ingen', true) }}"
- choose: - choose:
- conditions: - conditions:
- condition: template - condition: template
@@ -66,6 +80,7 @@
roborock_family_away roborock_family_away
and roborock_auto_runs < 2 and roborock_auto_runs < 2
and not roborock_is_cleaning and not roborock_is_cleaning
and roborock_state not in ['error', 'unknown', 'unavailable']
and roborock_battery > 20 and roborock_battery > 20
}} }}
sequence: sequence:
@@ -73,13 +88,13 @@
target: target:
entity_id: button.roborock_s8_pro_ultra_kokken_bryggers entity_id: button.roborock_s8_pro_ultra_kokken_bryggers
- delay: "00:00:20" - wait_template: "{{ is_state('vacuum.roborock_s8_pro_ultra', 'cleaning') }}"
timeout: "00:02:00"
- choose: - choose:
- conditions: - conditions:
- condition: state - condition: template
entity_id: vacuum.roborock_s8_pro_ultra value_template: "{{ wait.completed }}"
state: "cleaning"
sequence: sequence:
- service: input_number.increment - service: input_number.increment
target: target:
@@ -94,16 +109,20 @@
}} min. }} min.
- conditions: - conditions:
- condition: not - condition: template
conditions: value_template: "{{ not wait.completed }}"
- condition: state
entity_id: vacuum.roborock_s8_pro_ultra
state: "cleaning"
sequence: sequence:
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
title: "⚠️ Roborock start fejlede" title: "⚠️ Roborock start fejlede"
message: "Startkommando sendt, men den begyndte ikke at køre." message: >
Startkommando sendt, men den begyndte ikke at køre inden for 2 min.
State: {{ states('vacuum.roborock_s8_pro_ultra') }}.
Status: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'status') | default('ukendt', true) }}.
Error: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'error') | default('ingen', true) }}.
Batteri: {{ states('sensor.roborock_s8_pro_ultra_batteri') }}%.
Cleaned area: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaned_area') | default('ukendt', true) }}.
Cleaning time: {{ state_attr('vacuum.roborock_s8_pro_ultra', 'cleaning_time') | default('ukendt', true) }}.
default: default:
- service: notify.mobile_app_claus_iphone_15pro - service: notify.mobile_app_claus_iphone_15pro
data: data:
@@ -113,6 +132,7 @@
Familie hjemme: {{ not roborock_family_away }}. Familie hjemme: {{ not roborock_family_away }}.
Auto-kørsler i dag: {{ roborock_auto_runs }}. Auto-kørsler i dag: {{ roborock_auto_runs }}.
Kører allerede: {{ roborock_is_cleaning }}. Kører allerede: {{ roborock_is_cleaning }}.
State: {{ roborock_state }}.
Batteri: {{ roborock_battery }}%. Batteri: {{ roborock_battery }}%.
@@ -130,6 +150,9 @@
- condition: state - condition: state
entity_id: vacuum.roborock_s8_pro_ultra entity_id: vacuum.roborock_s8_pro_ultra
state: "cleaning" state: "cleaning"
- condition: state
entity_id: input_boolean.roborock_manuelt_startet
state: "off"
action: action:
- service: vacuum.return_to_base - service: vacuum.return_to_base
@@ -142,6 +165,21 @@
message: "Rengøring stoppet fordi nogen er kommet hjem." message: "Rengøring stoppet fordi nogen er kommet hjem."
# 🔄 Reset manuelt-startet flag når Roborock dokker
- id: roborock_reset_manuelt_flag
alias: Roborock - Reset manuelt startet flag
trigger:
- platform: state
entity_id: vacuum.roborock_s8_pro_ultra
to: "docked"
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.roborock_manuelt_startet
# 🧹 Syd på arbejdsdage # 🧹 Syd på arbejdsdage
- id: roborock_syd_workday_vacuum - id: roborock_syd_workday_vacuum
alias: Roborock støvsug syd på arbejdsdage alias: Roborock støvsug syd på arbejdsdage
@@ -0,0 +1,39 @@
- alias: 'Indkorsel: Slet gamle snapshots (behold 100)'
description: Køres via webhook fra galleriet sletter alle undtagen de 100 nyeste snapshots og regenererer galleriet.
trigger:
- platform: webhook
webhook_id: indkorsel_prune_100
allowed_methods: [POST]
local_only: true
action:
- action: shell_command.indkorsel_prune_keep_100
- delay: '00:00:02'
- action: shell_command.indkorsel_generate_gallery
mode: single
- alias: 'Snapshot ved person i indkorsel'
description: >
Gemmer et tidsstemplet snapshot + opdaterer latest.jpg + regenererer HTML-galleri,
hver gang binary_sensor.indkoersel_person skifter til 'on'.
trigger:
- platform: state
entity_id: binary_sensor.indkoersel_person
to: 'on'
condition: []
action:
- variables:
ts: "{{ now().strftime('%Y-%m-%d_%H-%M-%S') }}"
# Gem tidsstemplet kopi
- action: camera.snapshot
data:
entity_id: camera.indkoersel_sub
filename: "/config/www/snapshots/indkorsel/{{ ts }}.jpg"
# Overskriv latest.jpg (bruges af local_file-kamera i dashboardet)
- action: camera.snapshot
data:
entity_id: camera.indkoersel_sub
filename: "/config/www/snapshots/indkorsel/latest.jpg"
# Regenerer HTML-galleriet
- action: shell_command.indkorsel_generate_gallery
mode: queued
max: 5
+89
View File
@@ -0,0 +1,89 @@
##################################################
# Syg-status: sluk alarmer + motion-lys ved sygdom
#
# Triggeres af input_select.PERSON_status → "syg"
# Genaktiverer alarmer når status ikke længere er "syg"
# Motion-lys håndteres via conditions i lys_*.yaml
##################################################
# ---- Andreas ----
# Andreas har ingen Sonos-alarmer, så der er intet at slå fra/til ved sygdom.
# Motion-lys håndteres via condition i lys_andreas.yaml (tjekker andreas_status != syg).
# ---- Daniel ----
- alias: "Syg - Daniel - sluk alarmer"
id: syg_daniel_sluk_alarmer
trigger:
- platform: state
entity_id: input_select.daniel_status
to: "syg"
action:
- service: homeassistant.turn_off
target:
entity_id:
- switch.sonos_alarm_377 # Daniel hverdagsalarm
- switch.sonos_alarm_1894 # Daniel afsted
- switch.sonos_alarm_2273 # Daniel man/fre
- switch.sonos_alarm_3471 # Daniel lørdag
- alias: "Syg - Daniel - genaktiver alarmer"
id: syg_daniel_genaktiver_alarmer
trigger:
- platform: state
entity_id: input_select.daniel_status
not_to: "syg"
condition:
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: "on"
action:
- service: homeassistant.turn_on
target:
entity_id:
- switch.sonos_alarm_377
- switch.sonos_alarm_3471
# ---- Anne / Claus (soveværelse) ----
- alias: "Syg - Soveværelse - sluk alarmer"
id: syg_sovevaerelse_sluk_alarmer
trigger:
- platform: state
entity_id: input_select.anne_status
to: "syg"
- platform: state
entity_id: input_select.claus_status
to: "syg"
action:
- service: homeassistant.turn_off
target:
entity_id:
- switch.sonos_alarm_1782 # Soft wakeup
- switch.sonos_alarm_298 # Badeværelse
- alias: "Syg - Soveværelse - genaktiver alarmer"
id: syg_sovevaerelse_genaktiver_alarmer
trigger:
- platform: state
entity_id: input_select.anne_status
not_to: "syg"
- platform: state
entity_id: input_select.claus_status
not_to: "syg"
condition:
# Kun genaktiver hvis BEGGE ikke er syge
- condition: template
value_template: >
{{ not is_state('input_select.anne_status', 'syg') and
not is_state('input_select.claus_status', 'syg') }}
- condition: state
entity_id: binary_sensor.arbejdsdagimorgen
state: "on"
action:
- service: homeassistant.turn_on
target:
entity_id:
- switch.sonos_alarm_1782
- switch.sonos_alarm_298
+12
View File
@@ -4,6 +4,12 @@
- platform: time - platform: time
at: "13:05:00" at: "13:05:00"
condition:
- condition: template
value_template: >
{% set deadline = states('input_datetime.tesla_charge_deadline') %}
{{ deadline in ['unknown','unavailable',''] or as_timestamp(deadline) <= as_timestamp(now()) }}
action: action:
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
target: target:
@@ -23,6 +29,12 @@
entity_id: binary_sensor.snowywhite_charger entity_id: binary_sensor.snowywhite_charger
to: "on" to: "on"
condition:
- condition: template
value_template: >
{% set deadline = states('input_datetime.tesla_charge_deadline') %}
{{ deadline in ['unknown','unavailable',''] or as_timestamp(deadline) <= as_timestamp(now()) }}
action: action:
- service: input_datetime.set_datetime - service: input_datetime.set_datetime
target: target:
@@ -10,6 +10,10 @@
minutes: "0" minutes: "0"
condition: condition:
- condition: state
entity_id: input_boolean.tesla_manual_override
state: "off"
- condition: template - condition: template
value_template: > value_template: >
{% set deadline = states('input_datetime.tesla_charge_deadline') %} {% set deadline = states('input_datetime.tesla_charge_deadline') %}
@@ -65,3 +69,14 @@
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.home_charging entity_id: switch.home_charging
- alias: "Tesla - nulstil manuel override ved frakobling"
id: tesla_reset_manual_override
trigger:
- platform: state
entity_id: binary_sensor.snowywhite_charger
to: "off"
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.tesla_manual_override
@@ -6,6 +6,9 @@
{{ (states('sensor.snowywhite_battery')|float(0)) >= {{ (states('sensor.snowywhite_battery')|float(0)) >=
(states('number.snowywhite_charge_limit')|float(100)) }} (states('number.snowywhite_charge_limit')|float(100)) }}
action: action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.tesla_manual_override
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.home_charging entity_id: switch.home_charging
+2
View File
@@ -10,6 +10,8 @@
action: action:
- service: media_player.unjoin - service: media_player.unjoin
entity_id: media_player.badevaerelse entity_id: media_player.badevaerelse
- service: media_player.unjoin
entity_id: media_player.lille_badevaerelse
- service: media_player.unjoin - service: media_player.unjoin
entity_id: media_player.sovevaerelse entity_id: media_player.sovevaerelse
+2 -12
View File
@@ -1,12 +1,2 @@
### Set temperature to 24 in heat mode ### Kontor-varme styres nu af script.varme_recalculate (include/scripts/varme_styring.yaml)
- alias: "Tænd varme i kontor" ### Denne fil er beholdt tom for fremtidige manuelle overrides
trigger:
platform: time
at: "19:30:00"
action:
- service: climate.set_temperature
target:
entity_id: climate.kontor
data:
temperature: 24
hvac_mode: heat
+112
View File
@@ -0,0 +1,112 @@
##################################################
# Varme: Triggers der kalder script.varme_recalculate
# Scenarierne der kræver genberegning:
# - Morgen (input_datetime.varme_morgen_tid) - nat slut → komforttemp
# - Aften (input_datetime.varme_aften_tid) - nat start → natsænkning
# - Tilstedeværelse - hjemme/væk skifter
# - Ferietilstand - ferie til/fra
# - HA genstart - genopret korrekt temp
##################################################
- alias: "Varme - Genberegn: Morgen"
id: varme_recalc_morgen
description: "Slutter natsænkning - tidspunkt styret af input_datetime.varme_morgen_tid"
trigger:
- platform: time
at: input_datetime.varme_morgen_tid
action:
- service: script.varme_recalculate
- alias: "Varme - Genberegn: Nat"
id: varme_recalc_nat
description: "Starter natsænkning - tidspunkt styret af input_datetime.varme_aften_tid"
trigger:
- platform: time
at: input_datetime.varme_aften_tid
action:
- service: script.varme_recalculate
- alias: "Varme - Genberegn: Tilstedeværelse"
id: varme_recalc_presence
description: "Justerer temperaturer når family_presence ændres (hjemme/væk)"
trigger:
- platform: state
entity_id: binary_sensor.family_presence
action:
# Kort forsinkelse så person-sensorer er stabile
- delay: "00:01:00"
- service: script.varme_recalculate
- alias: "Varme - Genberegn: Ferie"
id: varme_recalc_vacation
description: "Skifter til ferie-/frosttemperatur når vacation_mode ændres"
trigger:
- platform: state
entity_id: input_boolean.vacation_mode
action:
- service: script.varme_recalculate
- alias: "Varme - Genberegn: HA genstart"
id: varme_recalc_ha_start
description: "Genopret korrekte temperaturer efter HA genstart"
trigger:
- platform: homeassistant
event: start
action:
# Vent til integrationer er loaded
- delay: "00:01:00"
- service: script.varme_recalculate
- alias: "Varme - Genberegn: Komforttemperatur ændret"
id: varme_recalc_komfort_changed
description: "Opdater varmeanlægget straks når en komforttemperatur justeres"
trigger:
- platform: state
entity_id:
- input_number.varme_komfort_andreas
- input_number.varme_komfort_daniel
- input_number.varme_komfort_sovevaerelse
- input_number.varme_komfort_kontor
- input_number.varme_komfort_gang
- input_number.varme_komfort_forgang
- input_number.varme_komfort_lille_bad
- input_number.varme_komfort_badevarelse
- input_number.varme_komfort_stue
action:
- service: script.varme_recalculate
- alias: "Varme - Ferietilstand: Aktiver ved afrejse"
id: varme_ferie_aktiver
description: "Slår vacation_mode til automatisk på afrejsetidspunktet (vacation_start)"
trigger:
- platform: time
at: input_datetime.vacation_start
action:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.vacation_mode
- alias: "Varme - Ferieopvarmning: Start 2 dage før hjemkomst"
id: varme_ferie_forvarm
description: >
Slår vacation_mode fra 2 dage inden vacation_end så huset er
varmt ved hjemkomst. Kører dagligt ved morgen-tidspunktet.
trigger:
- platform: time
at: input_datetime.varme_morgen_tid
condition:
- condition: state
entity_id: input_boolean.vacation_mode
state: "on"
- condition: template
value_template: >
{% set end = states('input_datetime.vacation_end') %}
{% if end not in ['unknown', 'unavailable', ''] %}
{{ 0 < (as_timestamp(end) - as_timestamp(now())) < (2 * 86400) }}
{% else %}
false
{% endif %}
action:
- service: input_boolean.turn_off
target:
entity_id: input_boolean.vacation_mode
+260
View File
@@ -0,0 +1,260 @@
##################################################
# Vindue-automationer (Aqara vinduesensorer)
##################################################
### Varme: Genberegn ved vindue-ændring (åbner og lukker)
### Script slukker klimaenhed hvis vindue er åbent, tænder igen ved lukning
- alias: "Varme - vindue åbner eller lukker"
id: varme_vindue_trigger
description: "Kalder varme_recalculate når et vindue eller terrassedøren skifter tilstand"
mode: queued
max: 10
trigger:
- platform: state
entity_id:
- binary_sensor.andreas_vindue
- binary_sensor.daniel_vindue
- binary_sensor.sovevaerelse_vindue
- binary_sensor.lille_bad_vindue
- binary_sensor.badevaerelse_vindue
- binary_sensor.terrassedor
to:
- "on"
- "off"
for: "00:00:05"
action:
- service: script.varme_recalculate
### Notifikation: Vindue åbner og ingen er hjemme
- alias: "Vindue åbent - ingen hjemme"
id: vindue_aabent_ingen_hjemme
description: "Send notifikation til Claus hvis et vindue åbner og ingen er hjemme"
trigger:
- platform: state
entity_id:
- binary_sensor.andreas_vindue
- binary_sensor.daniel_vindue
- binary_sensor.sovevaerelse_vindue
- binary_sensor.badevaerelse_vindue
- binary_sensor.lille_bad_vindue
- binary_sensor.terrassedor
to: "on"
condition:
- condition: state
entity_id: binary_sensor.family_presence
state: "off"
action:
- variables:
vindue_navne:
binary_sensor.andreas_vindue: "Andreas' værelse"
binary_sensor.daniel_vindue: "Daniels værelse"
binary_sensor.sovevaerelse_vindue: "Soveværelset"
binary_sensor.badevaerelse_vindue: "Badeværelset"
binary_sensor.lille_bad_vindue: "Lille badeværelse"
binary_sensor.terrassedor: "Terrassedøren"
vindue_navn: "{{ vindue_navne[trigger.entity_id] }}"
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "⚠️ Vindue åbnet - ingen hjemme"
message: "{{ vindue_navn }} er blevet åbnet, men der er ingen hjemme!"
data:
push:
sound:
name: default
critical: 0
### Notifikation: Sidste person forlader huset med åbent vindue
- alias: "Forlader huset - vindue åbent"
id: forlader_huset_vindue_aabent
description: "Send notifikation hvis family_presence slår fra og vinduer er åbne"
trigger:
- platform: state
entity_id: binary_sensor.family_presence
from: "on"
to: "off"
condition:
- condition: or
conditions:
- condition: state
entity_id: binary_sensor.andreas_vindue
state: "on"
- condition: state
entity_id: binary_sensor.daniel_vindue
state: "on"
- condition: state
entity_id: binary_sensor.sovevaerelse_vindue
state: "on"
- condition: state
entity_id: binary_sensor.badevaerelse_vindue
state: "on"
- condition: state
entity_id: binary_sensor.lille_bad_vindue
state: "on"
- condition: state
entity_id: binary_sensor.terrassedor
state: "on"
action:
- variables:
aabne_vinduer: >-
{% set vinduer = [] %}
{% if is_state('binary_sensor.andreas_vindue', 'on') %}
{% set vinduer = vinduer + ["Andreas' værelse"] %}
{% endif %}
{% if is_state('binary_sensor.daniel_vindue', 'on') %}
{% set vinduer = vinduer + ["Daniels værelse"] %}
{% endif %}
{% if is_state('binary_sensor.sovevaerelse_vindue', 'on') %}
{% set vinduer = vinduer + ["Soveværelset"] %}
{% endif %}
{% if is_state('binary_sensor.badevaerelse_vindue', 'on') %}
{% set vinduer = vinduer + ["Badeværelset"] %}
{% endif %}
{% if is_state('binary_sensor.lille_bad_vindue', 'on') %}
{% set vinduer = vinduer + ["Lille badeværelse"] %}
{% endif %}
{% if is_state('binary_sensor.terrassedor', 'on') %}
{% set vinduer = vinduer + ["Terrassedøren"] %}
{% endif %}
{{ vinduer | join(', ') }}
- variables:
# Find den person der sidst skiftede væk fra home
sidste_person: >-
{% set people = [
('person.claus_dethlefsen', 'notify.mobile_app_claus_iphone_15pro'),
('person.anne_schusler_dethlefsen', 'notify.mobile_app_annes_iphone_14_pro'),
('person.andreas_schusler_dethlefsen', 'notify.mobile_app_andreas_iphone_12'),
('person.daniel_schusler_dethlefsen', 'notify.mobile_app_daniels_iphone_13_mini')
] %}
{% set ns = namespace(latest='2000-01-01T00:00:00+00:00', svc='notify.mobile_app_claus_iphone_15pro') %}
{% for person_id, notify_svc in people %}
{% set changed = states[person_id].last_changed | string %}
{% if changed > ns.latest %}
{% set ns.latest = changed %}
{% set ns.svc = notify_svc %}
{% endif %}
{% endfor %}
{{ ns.svc }}
# Altid send til Claus
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "🏠 Åbne vinduer - alle er væk"
message: "Alle har forladt huset, men disse vinduer er åbne: {{ aabne_vinduer }}"
data:
push:
sound:
name: default
critical: 1
volume: 1.0
# Send også til den der sidst forlod huset (hvis det ikke er Claus)
- condition: template
value_template: "{{ sidste_person != 'notify.mobile_app_claus_iphone_15pro' }}"
- service: "{{ sidste_person }}"
data:
title: "🏠 Åbne vinduer - alle er væk"
message: "Alle har forladt huset, men disse vinduer er åbne: {{ aabne_vinduer }}"
data:
push:
sound:
name: default
critical: 1
volume: 1.0
### Ventilation: Luft ud ved høj CO2 eller luftfugtighed (kl 6-22)
- alias: "Ventilation - luft ud påmindelse"
id: ventilation_luft_ud_paamindelse
description: "Send notifikation om at lufte ud ved høj CO2 eller luftfugtighed"
trigger:
- platform: numeric_state
entity_id: sensor.sovevaerelse_stue_carbon_dioxide
above: 1000
id: andreas_co2
- platform: numeric_state
entity_id: sensor.sovevaerelse_daniel_carbon_dioxide
above: 1000
id: daniel_co2
- platform: numeric_state
entity_id: sensor.sovevaerelse_carbon_dioxide
above: 1000
id: sovevaerelse_co2
- platform: numeric_state
entity_id: sensor.sovevaerelse_stue_luftfugtighed
above: 70
id: andreas_fugt
- platform: numeric_state
entity_id: sensor.sovevaerelse_daniel_luftfugtighed
above: 70
id: daniel_fugt
- platform: numeric_state
entity_id: sensor.sovevaerelse_luftfugtighed
above: 70
id: sovevaerelse_fugt
condition:
- condition: time
after: "06:00:00"
before: "22:00:00"
action:
- variables:
rum_navne:
andreas_co2: "Andreas' værelse (CO₂)"
andreas_fugt: "Andreas' værelse (luftfugtighed)"
daniel_co2: "Daniels værelse (CO₂)"
daniel_fugt: "Daniels værelse (luftfugtighed)"
sovevaerelse_co2: "Soveværelset (CO₂)"
sovevaerelse_fugt: "Soveværelset (luftfugtighed)"
rum_navn: "{{ rum_navne[trigger.id] }}"
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "🌬️ Luft ud"
message: "{{ rum_navn }} har for høj værdi. Åbn vinduet for at lufte ud."
- alias: "Ventilation - luk vindue efter 15 min"
id: ventilation_luk_vindue_efter_15_min
description: "Påmind om at lukke vinduet 15 minutter efter det blev åbnet for udluftning"
mode: parallel
max: 3
trigger:
- platform: state
entity_id:
- binary_sensor.andreas_vindue
- binary_sensor.daniel_vindue
- binary_sensor.sovevaerelse_vindue
to: "on"
condition:
- condition: time
after: "06:00:00"
before: "22:00:00"
- condition: or
conditions:
- condition: template
value_template: >-
{{ trigger.entity_id == 'binary_sensor.andreas_vindue' and
(states('sensor.sovevaerelse_stue_carbon_dioxide') | float(0) > 1000 or
states('sensor.sovevaerelse_stue_luftfugtighed') | float(0) > 70) }}
- condition: template
value_template: >-
{{ trigger.entity_id == 'binary_sensor.daniel_vindue' and
(states('sensor.sovevaerelse_daniel_carbon_dioxide') | float(0) > 1000 or
states('sensor.sovevaerelse_daniel_luftfugtighed') | float(0) > 70) }}
- condition: template
value_template: >-
{{ trigger.entity_id == 'binary_sensor.sovevaerelse_vindue' and
(states('sensor.sovevaerelse_carbon_dioxide') | float(0) > 1000 or
states('sensor.sovevaerelse_luftfugtighed') | float(0) > 70) }}
action:
- variables:
vindue_navne:
binary_sensor.andreas_vindue: "Andreas' værelse"
binary_sensor.daniel_vindue: "Daniels værelse"
binary_sensor.sovevaerelse_vindue: "Soveværelset"
vindue_navn: "{{ vindue_navne[trigger.entity_id] }}"
- delay: "00:15:00"
- condition: template
value_template: "{{ is_state(trigger.entity_id, 'on') }}"
- service: notify.mobile_app_claus_iphone_15pro
data:
title: "🪟 Luk vinduet"
message: "Vinduet i {{ vindue_navn }} har været åbent i 15 minutter. Husk at lukke det igen."
+11
View File
@@ -0,0 +1,11 @@
- binary_sensor:
name: MQTT Broker TCP
unique_id: mqtt_broker_tcp
device_class: connectivity
# Opdater host hvis MQTT-brokeren flyttes til en anden maskine.
command: >-
python3 -c "import socket; s=socket.socket(); s.settimeout(2);
print('ON' if s.connect_ex(('10.0.0.142', 1883)) == 0 else 'OFF')"
payload_on: "ON"
payload_off: "OFF"
scan_interval: 60
+3
View File
@@ -0,0 +1,3 @@
badevaerelse_manuel_tilstand:
name: Badeværelse manuel tilstand
initial: off
+4
View File
@@ -0,0 +1,4 @@
left_home_by_car:
name: Forlod hjemmet i bil
icon: mdi:car
initial: false
+3
View File
@@ -0,0 +1,3 @@
gaester:
name: "Gæster hjemme"
icon: mdi:account-group
+5 -1
View File
@@ -1,3 +1,7 @@
vis_alle_vedligehold: vis_alle_vedligehold:
name: Vis alle vedligehold name: Vis alle vedligehold
icon: mdi:eye-outline icon: mdi:eye-outline
dishwasher_reminder_snoozed:
name: Opvaskemaskine - påmindelser snoozed
icon: mdi:bell-sleep
+7
View File
@@ -0,0 +1,7 @@
roborock_manuelt_startet:
name: Roborock manuelt startet
icon: mdi:robot-vacuum
ploeneklipper_manuelt_startet:
name: Plæneklipper manuelt startet
icon: mdi:robot-mower
+3
View File
@@ -0,0 +1,3 @@
tesla_manual_override:
name: Tesla manuel opladning
icon: mdi:car-electric
@@ -0,0 +1,4 @@
ploeneklipper_sidst_koert:
name: Plæneklipper sidst kørt
has_date: true
has_time: true
+8 -1
View File
@@ -1,5 +1,12 @@
vacation_start:
name: Vacation Start
has_date: true
has_time: true
initial: "2026-07-13 10:00:00"
vacation_end: vacation_end:
name: Vacation End name: Vacation End
has_date: true has_date: true
has_time: true has_time: true
initial: "2026-07-27 12:00:00"
+11
View File
@@ -0,0 +1,11 @@
varme_morgen_tid:
name: Varme - Morgen (nat slut)
has_date: false
has_time: true
icon: mdi:weather-sunny
varme_aften_tid:
name: Varme - Aften (nat start)
has_date: false
has_time: true
icon: mdi:weather-night
+1 -1
View File
@@ -4,7 +4,7 @@ badevaerelse_timeout_day:
max: 30 max: 30
step: 1 step: 1
unit_of_measurement: min unit_of_measurement: min
initial: 10 initial: 5
badevaerelse_timeout_night: badevaerelse_timeout_night:
name: Badeværelse lys timeout nat name: Badeværelse lys timeout nat
+23
View File
@@ -0,0 +1,23 @@
daniel_lux_threshold:
name: Daniel lux grænse
min: 0
max: 500
step: 5
unit_of_measurement: lux
initial: 90
daniel_timeout:
name: Daniel lys timeout
min: 1
max: 60
step: 1
unit_of_measurement: min
initial: 10
daniel_brightness:
name: Daniel lysstyrke
min: 1
max: 100
step: 1
unit_of_measurement: "%"
initial: 100
+23
View File
@@ -0,0 +1,23 @@
gang_lux_threshold:
name: Gang lux grænse
min: 0
max: 300
step: 5
unit_of_measurement: lux
initial: 70
gang_timeout_day:
name: Gang timeout dag
min: 1
max: 20
step: 1
unit_of_measurement: min
initial: 3
gang_timeout_night:
name: Gang timeout nat
min: 1
max: 10
step: 1
unit_of_measurement: min
initial: 1
+23
View File
@@ -0,0 +1,23 @@
kontor_lux_threshold:
name: Kontor lux grænse
min: 0
max: 500
step: 5
unit_of_measurement: lux
initial: 60
kontor_timeout_day:
name: Kontor timeout dag
min: 1
max: 60
step: 1
unit_of_measurement: min
initial: 5
kontor_timeout_night:
name: Kontor timeout nat
min: 1
max: 30
step: 1
unit_of_measurement: min
initial: 2
+15
View File
@@ -0,0 +1,15 @@
shelly_bagdor_event_cnt:
name: Shelly bagdoer event count
min: -1
max: 99999
step: 1
mode: box
initial: 67
shelly_fordor_event_cnt:
name: Shelly fordoer event count
min: -1
max: 99999
step: 1
mode: box
initial: -1
+39
View File
@@ -0,0 +1,39 @@
stue_lux_threshold:
name: Stue lux grænse
min: 0
max: 500
step: 5
unit_of_measurement: lux
initial: 60
stue_timeout_morgen:
name: Stue timeout morgen (06-16)
min: 10
max: 180
step: 5
unit_of_measurement: min
initial: 30
stue_timeout_eftermiddag:
name: Stue timeout eftermiddag (16-19)
min: 10
max: 240
step: 5
unit_of_measurement: min
initial: 120
stue_timeout_aften:
name: Stue timeout aften (19-00, TV slukket)
min: 1
max: 60
step: 1
unit_of_measurement: min
initial: 5
stue_timeout_nat:
name: Stue timeout nat (00-06)
min: 5
max: 120
step: 5
unit_of_measurement: min
initial: 5
+109
View File
@@ -0,0 +1,109 @@
# Komforttemperaturer per rum (Roth gulvvarme)
varme_komfort_andreas:
name: Komfort - Andreas
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 19
icon: mdi:thermometer
varme_komfort_daniel:
name: Komfort - Daniel
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 19
icon: mdi:thermometer
varme_komfort_sovevaerelse:
name: Komfort - Soveværelse
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 20
icon: mdi:thermometer
varme_komfort_kontor:
name: Komfort - Kontor
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 20
icon: mdi:thermometer
varme_komfort_gang:
name: Komfort - Gang
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 20
icon: mdi:thermometer
varme_komfort_forgang:
name: Komfort - Forgang
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 24
icon: mdi:thermometer
varme_komfort_lille_bad:
name: Komfort - Lille bad
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 24
icon: mdi:thermometer
varme_komfort_badevarelse:
name: Komfort - Badeværelse
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 21.5
icon: mdi:thermometer
varme_komfort_stue:
name: Komfort - Stue
min: 15
max: 28
step: 0.5
unit_of_measurement: "°C"
initial: 25
icon: mdi:thermometer
# Globale sænkninger
varme_nat_saenkning:
name: Natsænkning
min: 0
max: 8
step: 0.5
unit_of_measurement: "°C"
initial: 3
icon: mdi:weather-night
varme_vaek_saenkning:
name: Sænkning - ingen hjemme
min: 0
max: 8
step: 0.5
unit_of_measurement: "°C"
initial: 3
icon: mdi:home-export-outline
varme_ferie_temp:
name: Ferietemperatur (frostbeskyttelse)
min: 10
max: 18
step: 0.5
unit_of_measurement: "°C"
initial: 11
icon: mdi:beach
+1 -8
View File
@@ -1,10 +1,3 @@
#- platform: group # Gang light group is defined in grupper.yaml (unique_id: lys_gang)
# name: Gang
# entities:
# - light.fordelingsgang_1
# - light.fordelingsgang_2
# - light.fordelingsgang_3
# - light.fordelingsgang_4
# - light.fordelingsgang_5
-2
View File
@@ -105,7 +105,6 @@
name: Indkørsel name: Indkørsel
unique_id: lys_indkorsel unique_id: lys_indkorsel
entities: entities:
- light.indkorsel_plug
- light.udendors_forgang - light.udendors_forgang
- light.hue_ambiance_lamp_1_2 - light.hue_ambiance_lamp_1_2
- light.hue_ambiance_lamp_1_3 - light.hue_ambiance_lamp_1_3
@@ -116,7 +115,6 @@
unique_id: lys_udenfor unique_id: lys_udenfor
entities: entities:
- light.garage - light.garage
- light.indkorsel_plug
- light.fordoer - light.fordoer
- light.julelys - light.julelys
+12
View File
@@ -0,0 +1,12 @@
sensor:
- name: "Shelly bagdoer batteri"
state_topic: "shellies/shellybutton1-98CDAC1E5F42/sensor/battery"
unit_of_measurement: "%"
device_class: battery
value_template: "{{ value | int(0) }}"
- name: "Shelly fordoer batteri"
state_topic: "shellies/shellybutton1-C45BBE6A5696/sensor/battery"
unit_of_measurement: "%"
device_class: battery
value_template: "{{ value | int(0) }}"
+51
View File
@@ -1,3 +1,54 @@
godnat_sovevaerelse:
alias: Godnat - dæmp lys i soveværelse over 15 min
mode: restart
sequence:
- service: light.turn_on
target:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
data:
brightness_pct: 40
transition: 300
- delay: "00:05:00"
- service: light.turn_on
target:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
data:
brightness_pct: 10
transition: 300
- delay: "00:05:00"
- service: light.turn_on
target:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
data:
brightness_pct: 1
transition: 300
- delay: "00:05:00"
- service: light.turn_off
target:
entity_id:
- light.claus
- light.anne
- light.sov_dor
- light.sov_midt
- light.sov_vindue
data:
transition: 5
bed_standard_colors: bed_standard_colors:
sequence: sequence:
- service: light.turn_on - service: light.turn_on

Some files were not shown because too many files have changed in this diff Show More