IoT og smarthus

Magnetkontakt på dør: bygg alarm på tre nivåer

Fotorealistisk illustrasjon av en hvit magnetkontakt montert på en dørkarm og en dør som står på gløtt.

En magnetkontakt på døren kan gi et pip når garasjen åpnes, sende beskjed over WiFi eller inngå i en alarm med Home Assistant. Her bygger du tre løsninger: en enkel døralarm uten kode, en nettverkstilkoblet dørsensor med M5Stack og en liten alarmsentral på Raspberry Pi. Det samme prinsippet virker på et vindu, et skap eller en boddør.

Kort forklartMagneten følger døren, mens kontakten med ledning sitter på karmen. Når magneten flyttes bort, brytes forbindelsen. Den første kretsen gjør bruddet om til lyd. De to neste leser signalet på GPIO2 på AtomS3 Lite og bruker det til meldinger eller alarmstyring.
Dørstatus fra magnetkontakt til mobil: lukket og åpen dør ved siden av et illustrert varsel på telefonen.
Prinsippillustrasjon av resultatet. Telefonbildet viser et eksempel, ikke et skjermbilde av en ferdig installasjon.

Et byggeprosjekt, ikke en godkjent innbruddsalarm

Bruk løsningene til læring og ekstra varsling. De erstatter ikke et sertifisert alarmsystem. Kortsluttet sensorkabel, strømbrudd eller svikt i nettverket kan skjule en hendelse. Prosjektene bruker 3,3 V og 5 V, med 12 V til den valgfrie varsellampen. Ingen av kretsene du bygger, skal kobles til 230 V.

Om utprøvingen: Koblinger og programmer er kontrollert mot dokumentasjon og med programvaretester. Prosjektene er ennå ikke bygget og prøvd på fysisk maskinvare. Følg testpunktene på benken før du monterer noe.

Velg din døralarm med magnetkontakt

ProsjektResultatDu lærerBegrensning
1. Summer og transistorerLyd så lenge døren er åpenReedkontakt, basestrøm og transistorbryterIngen forsinkelse, fjernvarsling eller alarmminne
2. AtomS3 Lite og MQTTOPEN/CLOSED til en mottaker på lokalnettetGPIO, kontaktstøy, WiFi og meldingerKorte åpninger kan gå tapt under nettverksbrudd
3. ESPHome og Home AssistantSelvstendig sensor, alarmtilstander og mobilvarselLokal smarthusstyring og feiltilstanderServer og nettverk må ha strøm; mobilvarsel kan kreve internett

Bygg ett nivå om gangen. Prosjekt 2 og 3 bruker samme sensor og AtomS3 Lite, men forskjellig programvare: når du legger inn ESPHome, erstatter det UIFlow. Du trenger ikke kjøpe to kontrollere for å prøve begge.

Slik virker en magnetisk dørkontakt

En reedkontakt er en bryter som påvirkes av en magnet. Den trenger ikke egen strømforsyning. Magnetfeltet beveger små metallkontakter inne i sensoren; elektronikken utenfor må avgjøre hva et åpent eller lukket kontaktpar betyr.

Vi bruker magnetkontakten MR-00148 med magnet og monteringsskruer. For dette oppsettet skal den lede når magneten er nær, og bryte når magneten fjernes. Mål med multimeter før du bygger. Med magneten nær skal du måle lav motstand. Når magneten flyttes bort, skal måleren vise brudd. Produktkortet oppgir omtrent 200 Ω intern motstand, så multimeterets kontinuitetssummer er ikke alltid nok til å bedømme kontakten.

DørMagnetKontaktGPIO med pull-up
LukketNær sensorenLeder0 / LOW
ÅpenBorte fra sensorenBrudd1 / HIGH
KabelbruddUansettBrudd1 / HIGH

Monter sensoren på den faste karmen og magneten på den bevegelige delen. Prøv plasseringen med tape før du skrur fast. Avstanden må gi stabilt lukket signal også når døren beveger seg litt i trekken. Metall rundt en garasjeport kan endre magnetfeltet; test på selve monteringsstedet.

Prosjekt 1: enkel alarm med aktiv summer

Nivå 1: nybegynner. Tid: 45 til 60 minutter. Du trenger magnetkontakten fra starten, aktiv summer MR-00118, to BC547B, tre motstander, en diode, koblingsbrett, ledninger og regulert 5 V. Ingen programmering. Velg passende koblingsbrett og koblingsledninger.

En aktiv summer har tonegenerator inni og lager lyd når den får likespenning. En passiv summer trenger et vekslende styresignal og kan ikke settes rett inn i samme krets. MR-00118 bruker 5 V og trekker høyst 30 mA etter produktopplysningene.

  • BC547B, pakke med femBruk to: Q1 snur signalet, Q2 driver summeren.
    kr 29,00
    På lager
  • Motstandssett med 16 verdierBruk én 10 kΩ, én 100 kΩ og én 1 kΩ, alle 0,25 W.
    kr 149,00
    På lager
  • 1N4007-dioderBruk én over summeren, med stripen mot +5 V.
    kr 25,00
    På lager
  • Koblingsbrettsett med strømmodul og ledninger830 hull og 65 hann-hann-ledninger. Kontroller inngangen på strømmodulen; nettadapter følger ikke nødvendigvis med.
    kr 219,00
    På lager

Til første benktest bruker du en regulert laboratorieforsyning på 5,0 V med strømgrense på omtrent 0,10 A. Har du allerede et koblingsbrett og ledninger, trenger du ikke et nytt sett. En MB102-modul må få riktig likespenning på DC-inngangen og ha jumperen på 5 V; USB-A-kontakten på modellen i butikken er oppgitt som utgang, ikke som inngang. Bruk aldri et løst nettspenningskort for dette prosjektet.

Døralarm med to BC547B og aktiv summer: reedkontakten styrer Q1, mens Q2 slår på lyden når døren åpnes.
Elektrisk skjema, tegnet med magneten borte og kontakten åpen. Det viser forbindelser, ikke beina slik de står på koblingsbrettet. K markerer katoden på dioden, siden med stripe.

Hvorfor to transistorer?

Magnetkontakten leder når døren er lukket. Setter du den bare i serie med summeren, får du lyd på feil tidspunkt. Her slår den på Q1 i lukket tilstand. Q1 holder basen til Q2 lav, slik at Q2 og summeren er av. Når døren åpnes, slås Q1 av; 1 kΩ-motstanden gir basestrøm til Q2, og summeren får strøm.

To trinn tar også hensyn til motstanden i kontakten. En snarvei der en slik kontakt skal kortslutte basen til én transistor, kan gi for høy basespenning og svak lyd selv med lukket dør. I koblingen under går bare rundt 0,4 mA gjennom kontakten. Summerens strøm går gjennom Q2.

Koble kretsen uten strøm

BC547B har tilkoblingene kollektor (C), base (B) og emitter (E). Kontroller databladet for transistoren du har; ikke bytt til en annen type ut fra at plastkapslingen ser lik ut. Skjemaet viser elektriske forbindelser, ikke plasseringen av beina. Sett hvert bein i en egen kontaktgruppe på koblingsbrettet. MR-00148 har to skrueklemmer under dekselet. Skru en hann-hann-ledning fast i hver klemme og sett de andre endene i koblingsbrettet. Kontakten har ingen polaritet, så det spiller ingen rolle hvilken klemme som går til +5 V.

FraTilRolle
+5 VKontaktens første skrueklemmeStrøm til styretrinnet
Kontaktens andre skrueklemme10 kΩ, deretter Q1 baseBegrenser basestrøm
Q1 base100 kΩ til GNDHolder Q1 av ved brudd
Q1 emitter og Q2 emitterGNDFelles minus
Q1 kollektorQ2 baseSnur signalet
+5 V1 kΩ, deretter Q2 baseSlår Q2 på når Q1 er av
Summer + / summer −+5 V / Q2 kollektorLydutgang
1N4007 katode / anode+5 V / Q2 kollektorStripen på dioden mot pluss
Døralarm med to BC547B og aktiv summer på koblingsbrett: magnetkontakten styrer Q1, og Q2 slår på summeren når døren åpnes.
Den samme kretsen på koblingsbrettet, sett ovenfra. Q1 og Q2 står med den flate siden mot deg. Ledningene fra magnetkontakten er skrudd fast i de to skrueklemmene. 1 kΩ-motstanden fra +5 V står i kolonnen til Q1 kollektor, og den grønne ledningen kobler denne kolonnen til Q2 base. Stripen på 1N4007 vender mot +5 V.
  1. Mål motstandene før du setter dem inn. Kontroller at pluss- og minusskinnene ikke er kortsluttet.
  2. Koble etter tabellen. Har strømskinnene et brudd midt på brettet, må du koble de delene du bruker sammen.
  3. Hold magneten nær sensoren og slå på 5 V. Summeren skal være stille.
  4. Flytt magneten bort. Summeren skal gi en jevn tone. Før magneten tilbake: lyden skal stoppe.
  5. Koble fra én sensorledning mens forsyningen er på. Lyden skal komme tilbake. Slå av forsyningen før du endrer andre koblinger.

Prøv selv: Sett inn en bryter i 5 V-ledningen, slik at du kan slå alarmen av og på manuelt. Alarmen har ikke minne: den blir stille når døren lukkes. Den slutter også å virke hvis strømmen forsvinner.

Hvis summeren alltid piper eller aldri piper

Alltid lyd: undersøk sensorledningen, Q1 og forbindelsen fra Q1 kollektor til Q2 base. Ingen lyd: mål 5 V, sjekk summerens polaritet og kontroller C, B og E på Q2. En diode som står feil vei, kan kortslutte forsyningen gjennom Q2; slå av straks hvis strømgrensen slår inn. Kontroller også at du har en aktiv summer.

Vil du forstå beregningen bak basestrømmen, fortsett med guiden om BJT og MOSFET. For en fast installasjon erstattes løse koblingsbrettforbindelser med ordentlige tilkoblinger og strekkavlastning.

Prosjekt 2: M5Stack sender dørstatus over WiFi

Nivå 2: viderekommen. Tid: 60 til 90 minutter. Du trenger samme magnetkontakt, AtomS3 Lite MR-01264, USB-C-datakabel, 2,4 GHz WiFi og en MQTT-broker på lokalnettet. Du trenger også Grove-kabelen MR-01369 med frie ledere. Den blå og den svarte lederen skrus rett inn i klemmene på magnetkontakten. Transistorkretsen fra nivå 1 brukes ikke her.

MQTT er en måte å sende små meldinger via en sentral mottaker, en broker. Enheten publiserer for eksempel OPEN på emnet verksted/dor/state. Et annet program abonnerer på emnet og kan vise status, logge åpninger eller aktivere noe. Du binder dermed ikke sensoren til én bestemt app.

AtomS3 Lite koblet til magnetkontakten med Grove-kabel: blå G2 og svart GND i skrueklemmene, gul og rød leder isolert.
Grove-kabelen MR-01369 sitter i HY2.0-porten på AtomS3 Lite. Blå G2 og svart GND skrus fast i magnetkontaktens to skrueklemmer; kontakten har ingen polaritet. Gul G1 og rød 5 V isoleres hver for seg. GPIO2 skal aldri få 5 V.

På AtomS3 Lite er lederen ved siden av den røde GPIO2, og den svarte er GND. I MR-01369 er GPIO2-lederen blå. Koble kontakten mellom disse: løsne skruene under dekselet, tvinn de tynne trådene i hver lederende sammen, stikk dem inn i hver sin klemme og skru til. Trekk lett i lederne for å kontrollere at de sitter. Den røde lederen er 5 V, og den gule lederen ytterst er GPIO1. Begge skal være frakoblet og isolert i dette prosjektet. M5Stacks egne HY2.0-kabler har andre farger: gul for GPIO2 og hvit for GPIO1. Følg derfor plasseringen i pluggen, ikke bare fargen. Koblingen er ikke lik på eldre Atom Lite. Ikke koble 5 V fra prosjekt 1 til GPIO2.

Den interne pull-up-motstanden trekker GPIO2 mot 3,3 V når kontakten bryter. Med lukket kontakt trekkes inngangen mot GND. Bruk en kort sensorledning på arbeidsbenken. Lange kabler ut til en garasje trenger ekstra beskyttelse og vurdering av støy; dette er ikke et ferdig oppsett for lange utendørs strekk.

1. Gjør MQTT-mottakeren klar

  1. Bruk en eksisterende lokal MQTT-broker, eller installer Eclipse Mosquitto på en datamaskin som skal stå på. Lag en egen mappe for benktesten. Ikke endre en broker som allerede styrer huset.
  2. Opprett passordfilen fra denne mappen med kommandoen under. Verktøyet spør etter et passord; bruk en egen konto til prosjektet.
  3. Lagre konfigurasjonen som mosquitto.conf i samme mappe og start Mosquitto derfra. Port 1883 må være ledig. Tillat innkommende trafikk bare fra det betrodde lokalnettet i datamaskinens brannmur.
  4. Finn datamaskinens lokale IPv4-adresse i nettverksinnstillingene. Reserver adressen i ruteren. Kortet og mottakeren må kunne nå hverandre; et isolert gjestenett virker vanligvis ikke.
mosquitto_passwd -c passwd dorvarsler
mosquitto -c mosquitto.conf -v
listener 1883
allow_anonymous false
password_file ./passwd
persistence false

Bruk -c bare når du oppretter en ny passordfil; på en eksisterende fil ville den slette de andre brukerne. Kjør testbrokeren som din vanlige bruker fra prosjektmappen, ikke med administratorrettigheter. Konfigurasjonen passer Mosquitto 2.x. Dersom installasjonen allerede kjører som en tjeneste, bruk den tjenestens dokumenterte oppsett i stedet for å starte en ekstra broker på samme port.

Bare i et betrodd lokalnettEksemplet bruker MQTT uten TLS på port 1883. Bruk egne testpassord og ikke åpne porten i ruteren. For forbindelse utenfra trenger du en separat løsning med VPN eller korrekt verifisert TLS.

2. Legg inn UIFlow og prøv blokkprogrammet

  1. Åpne M5Burner, velg AtomS3 Lite og installer UIFlow 2-firmware for akkurat denne modellen. Bruk en datakabel. Hvis porten ikke dukker opp, hold resetknappen inne i omtrent to sekunder til enheten går i nedlastingsmodus, slik M5Stacks veiledning beskriver.
  2. Åpne UIFlow 2, velg samme modell og koble til via USB. Begynn med programmet under, som bare leser kontakten og skriver til WebTerminal.
  3. Åpne og lukk kontakten. Vent på OPEN og CLOSED. Signalet skal ha vært stabilt gjennom omtrent 60 ms før det godtas.
  4. Lagre prosjektet på maskinen. Bruk Run Once under utprøving og Run Always først når du har kontrollert oppførselen.

UIFlow-guiden med M5Burner, blokker og WebTerminal forklarer oppkoblingen grundigere. Her er hele avlesningsprogrammet; nettverksdelen kommer i neste trinn.

UIFlow 2 Setup: GPIO2 settes som inngang med pull-up, og variablene får startverdier.
Setup kjøres én gang. Blokkene er gjengitt fra prosjektfilen med UIFlow 2.
UIFlow 2 Loop: kontakten leses, korte forstyrrelser filtreres, og OPEN eller CLOSED skrives til terminalen.
Loop gjentas. Etter et stabilt signal skrives OPEN eller CLOSED. Lange betingelser er satt over flere linjer; blokkene og verdiene er de samme som i prosjektfilen.

Last ned blokkprosjekt og kildekode

Pakk ut ZIP-filen, åpne magnetkontakt-atoms3-lite-blokker.m5f2 fra filmenyen i UIFlow 2 og velg AtomS3 Lite. Python-koden under følger samme logikk. Blokkfilens struktur er kontrollert mot offisielle M5Stack-eksempler; faktisk import og kjøring må fortsatt prøves på ditt oppsett.

# MRSMART: same algorithm as the accompanying UIFlow2 blocks.
# AtomS3-Lite, UIFlow2. Reed between GPIO2 and GND (blue and black lead on MR-01369).
import M5
from hardware import Pin
import time

M5.begin()
pin2 = Pin(2, mode=Pin.IN, pull=Pin.PULL_UP)
sample = -1
stable = -1
count = 0
while True:
    M5.update()
    raw = pin2.value()
    if raw == sample:
        if count < 3:
            count += 1
    else:
        sample = raw
        count = 0
    if count >= 3 and raw != stable:
        stable = raw
        if stable == 1:
            print("OPEN")
        else:
            print("CLOSED")
    time.sleep_ms(20)

Send MQTT med ekte UIFlow-blokker

Vil du prøve hele meldingsveien med blokker, åpner du magnetkontakt-atoms3-lite-wifi-blokker.m5f2 fra ZIP-filen. Dette er et eget program; det erstatter det lille avlesningsprogrammet. I Setup fyller du ut WIFI_SSID, WIFI_PASSWORD, MQTT_HOST, MQTT_USER og MQTT_PASSWORD. Gi hver enhet sin egen CLIENT_ID, for eksempel mrsmart-dor-benktest-1. Sett STATE_TOPIC til hele emnet, for eksempel verksted/dor/state.

Start mottakeren før du kjører blokkprogrammet. Etter WiFi- og MQTT-tilkoblingen publiserer det OPEN eller CLOSED når den filtrerte tilstanden endres, og omtrent hvert femte sekund mens forbindelsen fungerer. Den tilhørende filen magnetkontakt-atoms3-lite-wifi-blokker.py inneholder Python-koden fra de samme blokkene. Bruk testene for lukket dør, åpen dør og kontaktstøy fra forrige trinn.

Se hele blokkprogrammet for WiFi og MQTT
UIFlow 2 Setup for MQTT: WiFi, broker, innlogging, klient-ID og emne angis før kontakten leses.
Fyll inn dine egne verdier i Setup. Plassholderne her inneholder ingen ekte innloggingsopplysninger.
UIFlow 2 Loop for MQTT: kortet kobles til nettverket, kontaktstøy filtreres, og dørstatus sendes ved endring og med faste mellomrom.
Hele Loop-delen fra MQTT-prosjektfilen, gjengitt med blokkformene og fargene fra UIFlow 2. Trykk på bildet for å forstørre det.

3. Legg inn innstillingene dine for WiFi og MQTT

Øverst i programmet under står seks innstillinger: navnet på WiFi-nettet, WiFi-passordet, brokerens lokale IPv4-adresse, MQTT-brukeren, MQTT-passordet og emnet. Kopier programmet og erstatt verdiene med dine egne. Bruk en privat adresse på lokalnettet, for eksempel 192.168.1.50, og et eget emne for hver dør.

Skriv verdiene som Python-strenger. Anførselstegn inne i strengen og omvendte skråstreker må skrives med en ekstra omvendt skråstrek foran. Filen inneholder da passordene dine; oppbevar den trygt og ikke del den med andre.

# AtomS3 Lite / UIFlow 2: GPIO2 to reed contact to GND.
# Local MQTT only. Do not expose port 1883 to the internet.
import time
import network
import machine
import ubinascii
import M5
from hardware import Pin
from umqtt.simple import MQTTClient, MQTTException

WIFI_SSID = "DITT_WIFI"
WIFI_PASSWORD = "DITT_WIFI_PASSORD"
MQTT_HOST = "192.168.1.50"
MQTT_USER = "dorvarsler"
MQTT_PASSWORD = "DITT_MQTT_PASSORD"
TOPIC = "verksted/dor"

M5.begin()
reed = Pin(2, mode=Pin.IN, pull=Pin.PULL_UP)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
client_id = b"dor-" + ubinascii.hexlify(machine.unique_id())
state_topic = (TOPIC + "/state").encode()
availability_topic = (TOPIC + "/availability").encode()
client = None
raw = reed.value()
stable = None
changed_at = time.ticks_ms()
last_wifi = time.ticks_add(changed_at, -10000)
last_mqtt = time.ticks_add(changed_at, -5000)
last_sent = time.ticks_add(changed_at, -15000)
pending = True

while True:
    M5.update()
    now = time.ticks_ms()
    value = reed.value()
    if value != raw:
        raw = value
        changed_at = now
    if time.ticks_diff(now, changed_at) >= 50 and raw != stable:
        stable = raw
        pending = True
        print("OPEN" if stable else "CLOSED")

    if not wlan.isconnected():
        if client is not None:
            try:
                client.sock.close()
            except Exception:
                pass
            client = None
        if time.ticks_diff(now, last_wifi) >= 10000:
            last_wifi = now
            try:
                wlan.disconnect()
                wlan.connect(WIFI_SSID, WIFI_PASSWORD)
            except OSError as error:
                print("WiFi:", error)
    elif client is None and stable is not None:
        if time.ticks_diff(now, last_mqtt) >= 5000:
            last_mqtt = now
            candidate = None
            try:
                candidate = MQTTClient(client_id, MQTT_HOST, port=1883,
                    user=MQTT_USER.encode(), password=MQTT_PASSWORD.encode(), keepalive=60)
                candidate.set_last_will(availability_topic, b"offline", retain=True)
                candidate.connect(timeout=3)
                candidate.sock.settimeout(3)
                client = candidate
                # Re-sample after connect: never publish an old state as current.
                raw = reed.value()
                stable = None
                changed_at = time.ticks_ms()
                pending = True
                print("MQTT connected")
            except (OSError, ValueError, MQTTException) as error:
                print("MQTT:", error)
                if candidate is not None:
                    try:
                        candidate.sock.close()
                    except Exception:
                        pass
    elif client is not None and stable is not None:
        if pending or time.ticks_diff(now, last_sent) >= 15000:
            try:
                client.publish(state_topic, b"OPEN" if stable else b"CLOSED", retain=True)
                client.publish(availability_topic, b"online", retain=True)
                last_sent = time.ticks_ms()
                pending = False
            except OSError as error:
                print("MQTT send:", error)
                try:
                    client.sock.close()
                except Exception:
                    pass
                client = None
                last_mqtt = time.ticks_ms()
    time.sleep_ms(20)

Programmet krever UIFlow 2-fastvare 2.4.0 eller nyere, fordi programmet setter tidsavbrudd på MQTT-tilkoblingen. På eldre fastvare stopper det med en TypeError; installer i så fall en nyere versjon med M5Burner. Kopier hele programmet til Python-editoren i UIFlow for AtomS3 Lite, og kjør det med WebTerminal åpen. Dette er tekstprogrammet med nettverkslogikk; det blir ikke automatisk gjort om til vanlige grafiske blokker. Bruk først Run Once. Når testen under er bestått, last det ned med Run Always og koble USB-strømmen fra og til for å kontrollere automatisk oppstart.

Hva gjør programmet?

Pin.PULL_UP gir inngangen en bestemt hvileverdi. Tidskontrollen på 50 ms filtrerer korte sprett når kontakten skifter. Programmet skriver til WebTerminal når den stabile tilstanden endres, og sender samme tilstand på MQTT.

En retained-melding betyr at brokeren beholder siste verdi til neste mottaker kobler til. Det er ikke bevis på at sensoren fortsatt lever. Derfor sendes også online, mens brokerens Last Will blir offline når forbindelsen forsvinner uventet. Ved manglende meldinger må en mottaker bruke en tidsgrense, ikke anta at en gammel CLOSED-melding betyr at døren fortsatt er lukket.

Koden sender oppdatering hvert 15. sekund og prøver nettverket igjen etter feil. Nettverksoperasjoner har tidsavbrudd, men et tilkoblingsforsøk kan stanse avlesningen i flere sekunder; dette er en statusvarsler, ikke en garantert hendelseslogger. Raske åpninger under nettverksbrudd eller tilkoblingsforsøk kan gå tapt. Etter ny tilkobling leses kontakten på nytt før neste melding.

4. Se meldingene og prøv en feil

Installer en MQTT-klient, for eksempel MQTT Explorer fra prosjektets eget nettsted. Opprett en forbindelse til den samme lokale IP-adressen, port 1883 og brukeren dorvarsler. Bruk passordet du opprettet. Abonner på verksted/dor/#, eller det emnet du valgte i skjemaet.

verksted/dor/state          CLOSED
verksted/dor/availability   online
verksted/dor/state          OPEN

Trekk USB-kabelen ut av AtomS3 Lite og la brokeren stå på. Etter brokerens frist for manglende kontakt skal availability bli offline; det er ikke et øyeblikkelig signal. Koble strømmen tilbake og kontroller at den faktiske dørtilstanden kommer tilbake. Stans deretter brokeren og start den igjen: kortet skal koble til på nytt uten omprogrammering.

Prøv selv: bruk et eget emne for vinduet i boden, for eksempel bod/vindu. En mottaker kan abonnere på begge, men hver enhet må ha sitt eget emne. Kortet lager allerede en unik MQTT-klient-ID fra maskinvaren.

Prosjekt 3: Home Assistant som alarmsentral

Nivå 3: avansert. Tid: 2 til 3 timer. Du trenger sensoren og AtomS3 Lite fra nivå 2, samt en Home Assistant-server. Raspberry Pi 4B-startsettet med 4 GB RAM har kort, 32 GB microSD, strømforsyning, kabinett og Ethernet-kabel. Du trenger også en kortleser og Home Assistant Companion-appen på telefonen.

Nå får døren en rolle i en liten alarmsentral. Du kan være hjemme uten alarm, aktivere anlegget med tid til å gå ut, og få 15 sekunder til å slå det av når du kommer tilbake. Sensoren sender status direkte til Home Assistant med ESPHome; MQTT-brokeren fra nivå 2 trengs ikke til denne varianten.

Home Assistant med dørsensor og mobilvarsel: AtomS3 Lite sender status til Raspberry Pi over lokalnettet.
Systemskisse. Sensorkontakten sitter på AtomS3 Lite, ikke på Raspberry Pi-ens GPIO. Home Assistant styrer alarmtilstanden; testlyset er virtuelt.

1. Installer serveren på Raspberry Pi

  1. Ta sikkerhetskopi av filene du vil beholde på microSD-kortet. Neste trinn sletter innholdet. Åpne Raspberry Pi Imager, velg riktig Pi-modell og Home Assistant OS under andre spesialoperativsystemer. Velg microSD-kortet og skriv operativsystemet til kortet.
  2. Sett kortet i Pi-en, koble Ethernet til ruteren og bruk strømforsyningen fra settet. Du trenger ikke skjerm eller tastatur for dette oppsettet.
  3. Vent til første oppstart er ferdig, og åpne http://homeassistant.local:8123 på samme nett. Hvis navnet ikke virker, finn Pi-ens IP-adresse i ruteren og bruk den med port 8123.
  4. Opprett eierkonto, velg sted og tidssone, og ta en sikkerhetskopi etter grunnoppsettet. Reserver også Pi-ens IP-adresse i ruteren.

Følg Home Assistants egen installasjonsveiledning for modellvalget. Operativsystemet som eventuelt følger med kortet i startsettet, erstattes med Home Assistant OS.

2. Gjør AtomS3 Lite til en ESPHome-sensor

Installer ESPHome Device Builder fra Home Assistants appbutikk, start den og åpne nettgrensesnittet. Opprett en enhet med navnet dor-node. Lagre API-krypteringsnøkkelen fra veiviseren og et eget OTA-passord i ESPHomes secrets.yaml, sammen med WiFi-opplysningene. Dette er ESPHomes fil, ikke Home Assistants fil med samme navn.

wifi_ssid: "DITT_WIFI"
wifi_password: "DITT_WIFI_PASSORD"
dor_api_key: "KOPIER_DEN_GENERERTE_API_NOKKELEN"
dor_ota_password: "VELG_ET_EGET_LANGT_PASSORD"

Erstatt verdiene med dine egne. API-nøkkelen skal være en gyldig base64-kodet 32-byte-nøkkel, ikke et vanlig passord. Behold nøkkelen som veiviseren lager. Er WiFi-feltene allerede i filen, rediger dem uten å legge inn samme nøkkel to ganger.

esphome:
  name: dor-node
  friendly_name: Dørnode

esp32:
  board: esp32-s3-devkitc-1
  flash_size: 8MB
  framework:
    type: esp-idf

logger:

api:
  encryption:
    key: !secret dor_api_key

ota:
  - platform: esphome
    password: !secret dor_ota_password

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

binary_sensor:
  - platform: gpio
    name: Kontakt
    id: door_contact
    device_class: door
    pin:
      number: GPIO2
      mode:
        input: true
        pullup: true
    filters:
      - delayed_on: 50ms
      - delayed_off: 50ms
  1. Erstatt innholdet i enhetens YAML med filen over. Kontakten skal fortsatt være mellom GPIO2 og GND.
  2. Kjør Validate i ESPHome. Velg Install og førstegangsinstallasjon med USB. Bruk veiviserens nedlasting og nettleserbaserte opplasting dersom USB-kabelen står i PC-en, mens Device Builder kjører på Pi-en.
  3. Velg riktig serieport. Hold om nødvendig resetknappen inne for å gå i nedlastingsmodus. Dette erstatter UIFlow-programmet.
  4. Åpne loggen etter oppstart. I Home Assistant legger du til den oppdagede ESPHome-enheten og oppgir den samme API-nøkkelen.
  5. Finn Kontakt-entiteten og endre entitets-ID til binary_sensor.verksted_dor. Bekreft at lukket dør gir off, åpen gir on og frakoblet node til slutt gir unavailable.

Ikke legg inn inverted: true i denne koblingen: HIGH er åpen dør. Kontroller at statusen skifter både når du åpner døren og når du lukker den.

3. Legg til alarm, utgang og mobilvarsel

Installer Companion-appen og koble den til serveren. Tillat varsler og send et manuelt testvarsel fra Utviklerverktøy → Handlinger. Navnet er vanligvis notify.mobile_app_…. Noter det faktiske navnet; det varierer fra telefon til telefon.

Bruk File editor-appen eller en annen støttet filredigerer i Home Assistant. Legg dette inn under eksisterende homeassistant: i configuration.yaml. Har du ikke den delen fra før, opprett den én gang:

homeassistant:
  packages: !include_dir_named packages

Opprett mappen packages ved siden av configuration.yaml. I Home Assistants secrets.yaml legger du inn verksted_alarm_code: "DIN_EGEN_PIN" med din egen PIN-kode. Ikke bruk eksempelkoden som alarmkode.

Lagre filen under som packages/verksted-alarm.yaml. Opprett deretter varselgruppen i samme fil med utdraget som følger. Her er hele alarmoppsettet, inkludert kontroll av åpen eller utilgjengelig sensor etter at utgangstiden er over.

# Home Assistant package: /config/packages/verksted-alarm.yaml
# Rename the ESPHome contact entity to binary_sensor.verksted_dor first.
# Create the notify group named verksted_push as described in the guide.
alarm_control_panel:
  - platform: manual
    name: Verksted
    arming_states:
      - armed_away
      - armed_home
    code: !secret verksted_alarm_code
    arming_time: 30
    delay_time: 15
    trigger_time: 180
    disarmed:
      trigger_time: 0
    armed_home:
      arming_time: 0
      delay_time: 0

input_boolean:
  verksted_testlys:
    name: Verksted testlys
    icon: mdi:alarm-light-outline

script:
  verksted_arm:
    alias: Aktiver verkstedalarm
    sequence:
      - condition: state
        entity_id: binary_sensor.verksted_dor
        state: "off"
      - action: alarm_control_panel.alarm_arm_away
        target:
          entity_id: alarm_control_panel.verksted
        data:
          code: !secret verksted_alarm_code

automation:
  - id: verksted_contact_alarm
    alias: Verksted - kontakt eller bortfall
    triggers:
      - trigger: state
        entity_id: binary_sensor.verksted_dor
        to: "on"
      - trigger: state
        entity_id: binary_sensor.verksted_dor
        to: "unavailable"
      - trigger: state
        entity_id: binary_sensor.verksted_dor
        to: "unknown"
      - trigger: state
        entity_id: alarm_control_panel.verksted
        to: "armed_away"
      - trigger: state
        entity_id: alarm_control_panel.verksted
        to: "armed_home"
    conditions:
      - condition: template
        value_template: >-
          {{ states('alarm_control_panel.verksted') in ['armed_away', 'armed_home']
             and not is_state('binary_sensor.verksted_dor', 'off') }}
    actions:
      - action: alarm_control_panel.alarm_trigger
        target:
          entity_id: alarm_control_panel.verksted
    mode: single

  - id: verksted_alarm_output
    alias: Verksted - varsle og vis alarm
    triggers:
      - trigger: state
        entity_id: alarm_control_panel.verksted
        to: "triggered"
    actions:
      - action: input_boolean.turn_on
        target:
          entity_id: input_boolean.verksted_testlys
      - action: persistent_notification.create
        data:
          title: Verkstedalarm
          message: Døren er åpnet, eller kontakten har mistet forbindelsen.
      - action: notify.verksted_push
        data:
          title: Verkstedalarm
          message: Kontroller døren og sensorforbindelsen.
    mode: single

  - id: verksted_alarm_reset
    alias: Verksted - slå av testlyset
    triggers:
      - trigger: state
        entity_id: alarm_control_panel.verksted
        to: "disarmed"
    actions:
      - action: input_boolean.turn_off
        target:
          entity_id: input_boolean.verksted_testlys

Legg dette til nederst i samme pakkefil. Erstatt mobile_app_din_telefon med handlingsnavnet du testet, uten notify. foran:

notify:
  - platform: group
    name: verksted_push
    services:
      - action: mobile_app_din_telefon

Kjør Home Assistants konfigurasjonskontroll før omstart. Etter omstart legger du alarmkortet for alarm_control_panel.verksted, sensoren, skriptet «Aktiver verkstedalarm» og input_boolean.verksted_testlys på et kontrollpanel. Bruk aktiveringsskriptet til å aktivere alarmen når du går hjemmefra. Skriptet starter bare alarmen når sensoren bekrefter at døren er lukket. Alarmkortet brukes til å slå av med PIN-koden.

Testlyset er en synlig virtuell utgang, ikke en fysisk sirene. Når alt virker, kan du legge til en handling for en eksisterende lampe eller en ferdig integrert sirene i automasjonen «varsle og vis alarm». Lag også en tilsvarende av-handling i «slå av testlyset». Ikke koble en kraftig sirene direkte til GPIO.

Valgfritt: en fysisk varsellampe på 12 V

Vil du se alarmen uten å se på telefonen? Den oransje varsellampen MR-01592 blinker når den får 12 V likespenning. Produktopplysningene angir omtrent 150 mA. La Grove MOSFET MR-00899 slå lampen av og på. AtomS3 Lite sender bare styresignalet; lampestrømmen kommer fra en egen forsyning.

Deler, kobling og kode for varsellampen

Du trenger lampen, MOSFET-modulen, én 10 kΩ-motstand fra settet i prosjekt 1, en ekstra Grove-kabel MR-01369 (i tillegg til den fra prosjekt 2), en kort ledning og to koblingsklemmer med spak fra settet MR-00478: én med tre og én med fire innganger. Bruk den lukkede 12 V-forsyningen MR-00764 med en passende 5,5 × 2,1 mm DC-skruklemme, ledninger beregnet for minst 0,5 A og en 0,5 A likestrømssikring nær forsyningens pluss. Kontakten har pluss i midten; kontroller polariteten med multimeter. Forsyningen skal stå tørt innendørs. Til benktesten kan du bruke en regulert 12 V-laboratorieforsyning med strømgrense i stedet.

Velg riktig spenningsvariant

Kontroller at selve lampen er merket 12 V DC, og finn dokumentert pluss og minus før du kobler til. Nettbutikkens bilder kan vise en annen variant; ikke bestem polariteten ut fra ledningsfargen. Mangler merkingen, må leverandøren avklare den. MR-01594 er 230 V-varianten og hører ikke til denne koblingen.

Koble fra begge strømforsyningene. Magnetkontakten er fortsatt koblet til GPIO2, og GPIO1 skal styre lampen gjennom MOSFET-modulen. En vanlig Grove-kabel mellom Atom og modulen ville koblet G1 til SIG. Da ville du ikke fått koblet magnetkontakten til G2 og GND, og 5 V fra Atom ville gått til modulens VCC. Sett derfor én MR-01369 i Atom og én i MOSFET-modulen, og skjøt lederne i klemmene: gul G1 fra Atom skal til gul SIG på MOSFET-modulen. Den svarte lederen fra Atom flyttes fra magnetkontakten til GND-klemmen, og den korte ledningen går fra magnetkontaktens ledige skrueklemme til samme klemme. Den blå G2-lederen blir sittende i magnetkontakten. Koble etter signalnavnene i tabellen.

FraTil
Atom G1 og MOSFET SIG, begge gule ledereKlemme 1 med tre innganger (SIG)
Atom GND, svart leder, og MOSFET GND, svart lederKlemme 2 med fire innganger (GND)
10 kΩ-motstandFra klemme 1 til klemme 2; holder SIG lav når GPIO1 ikke styrer
Atom G2, blå lederMagnetkontaktens første skrueklemme, som i prosjekt 2
Magnetkontaktens andre skrueklemmeKlemme 2, med den korte ledningen
Atom 5 V og MOSFET VCC, røde ledereIngen tilkobling; isoleres hver for seg
MOSFET NC, blå lederIngen tilkobling; isoleres
12 V-forsyning + / −VIN+ via sikringen / VIN−
VOUT+ / VOUT−Lampens bekreftede + / −

Modulen trenger ikke 5 V fra Atom når lampen får 12 V på VIN. Inne i modulen går Grove-VCC via en diode til VIN. Er de røde lederne isolert, kan 5 V fra USB derfor ikke drive lampen hvis 12 V-forsyningen er koblet fra.

Varsellampe på 12 V styrt av AtomS3 Lite via Grove MOSFET: to Grove-kabler, koblingsklemmer for SIG og GND og sikring på 0,5 A.
AtomS3 Lite og MOSFET-modulen har hver sin Grove-kabel MR-01369. Klemme 1 samler SIG, og klemme 2 samler GND. Der to ledninger krysser hverandre i tegningen, er de ikke koblet sammen. Kontroller merkingen på lampen før du kobler VOUT.

Atom får fortsatt strøm gjennom USB-C. Koble aldri 12 V til Atom eller GPIO-pinnene. Modulen har felles jord, ikke galvanisk skille. Vi bruker den under produsentens grense på 2 A; den høyere strømgrensen i transistorens datablad gjelder ikke for hele modulen. Vurderingen av 3,3 V-styring følger produsentens koblingsskjema. Schottky-dioden på modulens VIN-inngang gir et lite spenningsfall: mål VOUT og kontroller at lampen blinker stabilt.

Bruk dor-node-varsellampe.yaml fra ZIP-filen i stedet for dor-node.yaml. Den komplette filen beholder dørsensoren og legger til koden under. En lokal tidsgrense slår lampen av etter omtrent 180 sekunder, også om nettverket faller ut, så lenge fastvaren kjører som den skal. ALWAYS_OFF setter av-tilstanden når fastvaren starter; det garanterer ikke en helt pulsfri oppstart.

# Optional 12 V lamp via Grove MOSFET MR-00899.
# Atom GPIO1 (yellow on MR-01369, white on M5Stack cables) -> module SIG (yellow); external 10k SIG-to-GND.
# GPIO2 remains the reed input. Never connect external 12 V to the Atom.
script:
  - id: beacon_timeout
    mode: restart
    then:
      - delay: 180s
      - switch.turn_off: varsellys

switch:
  - platform: gpio
    id: varsellys
    name: Varsellys
    pin:
      number: GPIO1
      inverted: false
    restore_mode: ALWAYS_OFF
    on_turn_on:
      - script.execute: beacon_timeout
    on_turn_off:
      - script.stop: beacon_timeout

Etter opplasting finner du den nye bryteren i Home Assistant. Endre entitets-ID-en til switch.verksted_varsellys. Legg følgende fil i /config/packages/verksted-varsellampe.yaml, i tillegg til alarmfilen du allerede har. Kjør konfigurasjonskontrollen og start Home Assistant på nytt. Home Assistant slår lampen på når alarmen går til triggered, og av i de andre alarmtilstandene. Det virtuelle testlyset beholdes.

# Optional Home Assistant package: /config/packages/verksted-varsellampe.yaml
# Use together with verksted-alarm.yaml, not instead of it.
# Rename the new ESPHome switch to switch.verksted_varsellys first.
automation:
  - id: verksted_physical_beacon
    alias: Verksted - fysisk varsellampe
    triggers:
      - trigger: state
        entity_id: alarm_control_panel.verksted
      - trigger: homeassistant
        event: start
      - trigger: state
        entity_id: switch.verksted_varsellys
        from: [unavailable, unknown]
        to: ["on", "off"]
    actions:
      - choose:
          - conditions:
              - condition: state
                entity_id: alarm_control_panel.verksted
                state: triggered
            sequence:
              - action: switch.turn_on
                target:
                  entity_id: switch.verksted_varsellys
        default:
          - action: switch.turn_off
            target:
              entity_id: switch.verksted_varsellys
    mode: restart
  1. La 12 V være frakoblet først. Slå på Atom og mål at GPIO1 er lav. Kontroller koblingen og isolasjonen før du kobler til lampestrømmen.
  2. Slå lampen på og av med bryteren i Home Assistant. Kontroller at den blinker stabilt. Hvis sikringen går eller strømgrensen nås, slå av og undersøk årsaken.
  3. Utløs alarmen med døren. Lampen skal starte ved triggered og stoppe når du slår alarmen av. Prøv også kaldstart, reset og en fastvareoppdatering før fast montering.
  4. Slå på lampen og bryt WiFi. Den lokale tidsgrensen skal stoppe den etter omtrent 180 sekunder fra innkobling. Etter strømbrudd skal den starte avslått. Hvis alarmen fortsatt står i triggered når forbindelsen kommer tilbake, kan Home Assistant starte en ny blinkeperiode. Et vellykket programkall bekrefter ikke at selve lampen lyser.

Dette skjer i de ulike tilstandene

TilstandHva skjer?Hva gjør du?
disarmedDørstatus vises uten å utløse alarmLukk døren og aktiver med skriptet
arming30 sekunder utgangstidGå ut og lukk døren
armed_awayÅpen eller utilgjengelig sensor utløser ventetidVed hjemkomst: slå av innen 15 sekunder
pending15 sekunder før alarmSlå av med PIN; å lukke døren alene avbryter ikke
triggeredTestlyset slås på og varsler sendesUndersøk årsaken og slå av alarmen

Etter 180 sekunder går alarmen tilbake til aktivert tilstand hvis du ikke har slått den av. Er sensoren fortsatt åpen eller utilgjengelig, begynner en ny varsling. Testlyset blir stående på til du slår av. En serveromstart gir ikke garanti for at den tidligere alarmtilstanden gjenopprettes: kontroller og aktiver anlegget på nytt.

Det innebygde manuelle alarmpanelet gir nok funksjoner for dette prosjektet. Flere soner kan få hver sin node og hver sin entitet. Utvid triggerlisten og betingelsen samlet, slik at ingen sone glemmes. Se guiden om smarthusprotokoller hvis du vil blande WiFi med Zigbee eller andre ferdige sensorer.

Test hele kjeden før du monterer

PrøveForventet resultat
Åpne og lukk ti gangerRiktig retning hver gang; ingen flimring ved lukket dør
Start med døren åpenProsjekt 1 gir lyd; prosjekt 2 sender OPEN; aktiveringsskriptet i prosjekt 3 stanser
Aktiver, men la døren stå åpen etter utgangstidenProsjekt 3 går videre til ventetid og alarm
Slå av under ventetidenIngen triggered-varsling; testlyset forblir av
Trekk ut sensorledningenOppfattes som åpen dør
Koble fra node eller WiFiMottakeren viser bortfall etter sin tidsgrense; aktivert HA-alarm reagerer på unavailable
Start broker, node og server på nytt hver for segStatus kommer tilbake; kontroller og aktiver serveralarmen på nytt
Prøv mobilvarsel på WiFi og mobilnettDu vet hvilke varsler som kommer fram hjemme og borte

En ledningssløyfe med bare to tilstander kan oppdage brudd, men ikke skille brudd fra åpen dør. En kortslutning kan se ut som lukket dør. For et mer robust anlegg trengs blant annet overvåket sløyfe, sabotasjevern, reservestrøm og kontrollert kommunikasjon. Det er et eget prosjekt, ikke noe en ekstra linje kode løser.

Vanlige spørsmål

Kan jeg koble magnetkontakten rett til summeren?

Bare hvis kontaktens faktiske funksjon og belastningsgrenser passer. MR-00148 leder med magneten nær, så en enkel seriekobling ville pipe når døren er lukket. Transistortrinnet snur funksjonen og lar sensoren styre en liten strøm.

Er dette også en alarm for et åpent vindu?

Ja. Prinsippet er det samme, men plasseringen må gi stabil kontakt i den lukkede stillingen du vil overvåke. Luftestilling kan gi åpent signal. Bestem på forhånd om det er ønsket.

Kan M5Stack sende e-post?

Det er mulig, men dette prosjektet sender status på lokalnettet og lar en mottaker håndtere varsler. Da trenger ikke sensoren lagre passordet til e-postkontoen. Home Assistant kan bruke SMTP-integrasjonen for e-postvarsler som et alternativ til mobilvarselet; kontoinnstillingene må passe e-postleverandøren.

Virker alarmen uten internett?

Prosjekt 1 er helt uten nettverk. MQTT og forbindelsen mellom ESPHome og Home Assistant kan fungere på lokalnettet uten internett. Fjernvarsling til mobil eller e-post kan likevel kreve internett og en ekstern tjeneste. Test nettverksbrudd og strømbrudd hver for seg.

Kan jeg bruke batteri?

Ikke legg til et løst litiumbatteri i koblingen. WiFi-koden er laget for kontinuerlig USB-strøm og går ikke i dvale. Batteridrift krever riktig strømforsyning, beskyttelse, lavt hvileforbruk og en bevisst løsning for hvordan åpninger registreres mens enheten sover.

Vil du oppdage bevegelse inne i rommet, se prosjektene med PIR-bevegelsessensor.

Kilder og videre bygging

Pinnevalg og opplasting følger M5Stacks dokumentasjon for AtomS3 Lite og UIFlow 2 for samme kort. Transistorvalget er kontrollert mot onsemis BC547-datablad. Kontroller alltid databladet til delene du faktisk bruker.

Nettverkskoden bruker M5Stacks MQTT-klient. Oppsettet bygger videre på dokumentasjonen for ESPHome GPIO-sensorer, Home Assistants manuelle alarmpanel og mobilvarsler i Companion.

Start med å få én kontakt til å virke på benken. Når koblingen og feilprøvene er forstått, velger du om du trenger bare en lyd, en WiFi-melding eller en lokal alarmsentral. Du finner flere monteringsformer i utvalget av magnetkontakter, og flere programmeringsveier i oversikten over ESP32 og M5Stack.

Alle guider

Produkter omtalt i denne guiden

Produktene som brukes og sammenlignes i guiden, med pris og lagerstatus.