Bewegingsmelder

Last Updated on 12 augustus 2022 by Syds

Dit project heeft tot doel een traditionele analoge bewegingsmelder “slim” te maken en te integreren in Domoticz.

In de gang van mijn woning hangt een Hager EE84 bewegingsmelder aan het plafond die de lichten in de gang gedurende de avonduren inschakelt bij beweging, en na verloop van tijd bij geen beweging weer uitschakelt. Voorheen werkte dit via een aangesloten SAIX10 van Eaton Holec, en werd de besturing gedaan door het domoticasysteem HomeControlBox via het A10/X10 protocol over het elektriciteitsnet. Aangezien ik dit oudere domoticasysteem aan het uitfaseren ben, en vervang door Domoticz oplossingen kwam dit project op mijn pad.

Bewegingsmelders worden 220v gevoed vanuit lichtnet en beschikken over een maakcontact. Plan is om middels een Hi-Link HLK-PM03 220v AC naar 3.3V DC converter een Wemos D1 bordje voeding te geven. Vervolgens het maakcontact van de bewegingsmelder te voeden vanuit de Gnd pin van de Wemos en aan te sluiten op GPIO 2.

Benodigdheden:

  • Wemos D1 mini (Aliexpress)
  • Hi-Link HLK-PM03 220v AC naar 3.3V DC converter
  • PCB bordje van 4,5 bij 2,5 cm
  • 2-voudige schroefklem
  • Soldeerbout
  • Soldeertin voor electronica
  • Paar dupont of andere dunne draadjes
  • Stanley mes of dremel om eventueel wat ruimte maken in de voet van de bewegingsmelder
  • Bewegingsmelder met enige ruimte in de voet

Reeds geïnstalleerd en up-and-running:

  • Domoticz
  • Optioneel: MQTT
  • Optioneel: MQTT plugin voor Domoticz

Pinout:

Lichtnet 220vHLK-PM03 inHLK-PM03 uitWemos D1
FaseAC+V03v3Bewegingsmelder
NuldraadAC-V0GNDPlusdraad
   GPIO 2 (D4)Min draad

Montage:

 

Ik heb de HLK-PM03 converter samen met een Wemos D1 mini en een twee-voudige schroefklem op een stukje printplaat gesoldeerd en conform bovenstaande pinout aan elkaar verbonden. Het resultaat is een printplaatje van zo’n 4 bij 2,5 cm wat precies in de “Wall plate” van de bewegingsmelder past nadat ik hier een paar plastic ribben en schotjes uit had gesneden met een stanley mes. Zie bovenstaande tekening, het onderste deel van de wall plate heb ik hiervoor benut. De kabels heb ik in het bovenste deel laten uitkomen waardoor het onderste deel vrij kwam voor de printplaat.

Stappenplan:

Stap 1. Wemos D1 flashen en configureren met ESP Easy conform https://www.twoenter.nl/blog/domotica/hoe-flash-espeasy-op-wemos-d1-mini/

  • Geef de Wemos D1 een vast IP adres in de router

Stap 2. Configureer een Bewegingsmelder in Domoticz als een Virtuele dummy switch, onthoudt de IDX voor stap 4

Label Waarde Doel
Naam Zinvolle naam  
Schakelaar type Motion Sensor  
Uitschakelvertraging 0  
Aan actie script:///home/pi/domoticz/scripts/Bewegingsmelder_gang.sh Uitvoeren van een shell-script die ervoor zorgt dat de verlichting aan gaat nadat er beweging wordt gesignaleerd, wordt later in Stap 3 uitgelegd

Stap 2. Configureer bewegingsmelder als een switch in ESP

Label Waarde Doel
Name Zinvolle naam  
Admin Password    
SSID SSID van je WIFI netwerk  
WPA Key Wachtwoord van je WIFI netwerk  
WPA AP Mode Key configesp default
Unit nr. 0 Uniek unit nummer voor ESP devices
Protocol Domoticz HTTP HTTP communicatie met Domoticz, je kan ook voor MQTT kiezen mits je een MQTT server up-and-running hebt
Controller IP IP-address van je Domoticz server  
Controller Port Poort nummer van je Domoticz server Default 8080
Controller User    
Controller Password    
Sensor delay 60 Default
Sleep mode niet aangevinkt Default
Label Waarde Doel
Device Switch input Het gedrag van GPIO-2 als aansturing door een schakelaar beschouwen
Name Zinvolle naam  
Delay 0 Default
IDX/Var: IDX van de virtuele switch die in Stap 2 aangemaakt hebt binnen Domoticz  
1st GPIO GPIO-2 Conform pinout
Pull UP aangevinkt activeer interne pull-up weerstand van de Wemos D1
Inversed aangevinkt Geen idee waarom, maar daarna werkte het 😉
Switch type Switch Bewegingsmelder gedraagt zich als een schakelaar
Switch button type Normal Switch Default
Send boot state niet aangevinkt Default
Value Name 1 Switch Default
Stap 3. Twee variabelen aangemaakt t.b.v. onderstaand script

TimerBewegingGangActief: Integer, Waarde 0: Krijgt waarde 0 of 1 na gelang de Timer actief is

TimerBewegingGang: Integer, Waarde 0: Telt af van 300 (5 minuten) tot 0 wanneer de timer actief wordt

Stap 4. Shell script ontwikkeld voor het inschakelen van de verlichting als de bewegingsmelder beweging detecteert

pi@raspberrypi:~/domoticz/scripts $ cat Bewegingsmelder_gang.sh
#!/bin/bash
# script zet Basisverlichting aan indien de bewegingsmelder in de gang beweging detecteert en de basisverlichting nog niet aanstaat
# tussen zonsondergang en zonsopgang
# zet een timer op 300 seconden
# en indien er nog geen script loopt start hij een countdown tot de timer op 0
# staat
# als de timer 0 bereikt schakelt hij de basisverlichting uit
#

verbose=1 # 0=nodebug, 1=debug

# check eerst of de basisverlichting brand, in dat geval hoeft de rest van het script niet uitgevoerd te worden
basisverlichting_active=`curl --url http://192.168.2.29:8080/json.htm\?type=devices\&rid=195 -s  | grep Status | awk '{print substr($3,2,3)}'`
if [ $verbose -gt 0 ]
then echo Basisverlichting_active=$basisverlichting_active
fi;

if [ $basisverlichting_active == "Off" ]
then
    # check eerst of de timer al actief is, in dat geval is er al eerder
    # beweging geconstateerd en de basisverlichting aangezet en hoeft de
    # timer alleen verhoogt te worden tot 300, een ander instantie van het
    # script doet de countdown en zet het licht uit
    timer_active=`curl --url http://192.168.2.29:8080/json.htm\?type=command\&param=getuservariable\&idx=43 -s  | grep Value | awk '{print substr($3,2,1)}'`
    log_message=""
    debug=""

    if [ $verbose -gt 0 ]; then echo Timer_active=$timer_active; fi;

    if [ $timer_active -gt 0 ]
    then
        # timer is actief, dus volstaan kan worden om de timer te verhogen
        # naar 300 sec.
        debug=$(curl -s  --url http://192.168.2.29:8080/json.htm\?type=command\&param=updateuservariable\&vname=TimerBewegingGang\&vtype=0\&vvalue=300)

        if [ $verbose -gt 0 ]
        then echo Set TimerBewegingGang=300 $debug; fi

        # log actie
        log_message="Timer%20BewegingGang%20op%2300%20gezet"
        curl -s --url http://192.168.2.29:8080/json.htm\?type=command\&param=addlogmessage\&message=$log_message

        # exit script
    else
        # variable declaratie
        #
        zonsondergang=`curl --url  http://192.168.2.29:8080/json.htm\?type=command\&param=getSunRiseSet -s | grep Sunset | awk '{print substr($3,2,2) substr($3,5,2)}'`
        uren=$((10#$(echo $zonsondergang | cut -c1-2)))
        min=$((10#$(echo $zonsondergang | cut -c3-4)))
        let zonsondergang=(uren*60)+min
        zonsopgang=`curl --url  http://192.168.2.29:8080/json.htm\?type=command\&param=getSunRiseSet -s | grep Sunrise | awk '{print substr($3,2,2) substr($3,5,2)}'`
        uren=$((10#$(echo $zonsopgang | cut -c1-2)))
        min=$((10#$(echo $zonsopgang | cut -c3-4)))
        let zonsopgang=(uren*60)+min;
        uren=$((10#$(date '+%H')))
        min=$((10#$(date '+%M')))
        let tijd=(uren*60)+min
        if [[ $tijd -lt $zonsopgang ]]
        then
            let tijd=tijd+1650;
        fi
        let zonsopgang=zonsopgang+1650;

        if [ $verbose -gt 0 ]
        then
            echo Zonsondergang=$zonsondergang
            echo Zonsopgang=$zonsopgang
            echo Tijd=$tijd
        fi

        # indien tussen zonsondergang en zonsopgang, zet dan de
        # basisverlichting aan
        if [[ $tijd -gt $zonsondergang ]] && [[ $tijd -lt $zonsopgang ]]
        then
            # zet device Basisverlichting aan
            debug=$(curl --url  http://192.168.2.29:8080/json.htm\?type=command\&param=switchlight\&idx=195\&switchcmd=On)
            if [ $verbose -gt 0 ]
            then
                echo Set device Buitenverlichting On $debug
            fi

            # zet timer op 300 sec.
            debug=$(curl -s  --url http://192.168.2.29:8080/json.htm\?type=command\&param=updateuservariable\&vname=TimerBewegingGang\&vtype=0\&vvalue=300)

            if [ $verbose -gt 0 ]
            then
                echo Set TimerBewegingGang=300 $debug
            fi

            # zet timer op actief
            debug=$(curl -s  --url http://192.168.2.29:8080/json.htm\?type=command\&param=updateuservariable\&vname=TimerBewegingGangActief\&vtype=0\&vvalue=1)

            if [ $verbose -gt 0 ]; then echo Set TimerBuitenActief=1 $debug; fi

            # log acties
            log_message="Basisverlichting%20aangezet,%20TimerBewegingGang%20op%20300%20sec.%20gezet,%20Timer%20geactiveerd"
            curl -s --url http://192.168.2.29:8080/json.htm\?type=command\&param=addlogmessage\&message=$log_message

            # start countdown
            i=$(curl --url http://192.168.2.29:8080/json.htm\?type=command\&param=getuservariable\&idx=44 -s  | grep Value | awk '{print $3}' | sed 's/\"//g' | sed 's/,//g')

            if [ $verbose -gt 0 ]
            then
                echo Initvalue TimerBewegingGang=$i $debug
            fi

            while [[ $i > 0 ]]
            do
              ((i--))
              curl -s  --url http://192.168.2.29:8080/json.htm\?type=command\&param=updateuservariable\&vname=TimerBewegingGang\&vtype=0\&vvalue=$i
              sleep 1
              i=`curl --url http://192.168.2.29:8080/json.htm\?type=command\&param=getuservariable\&idx=44 -s  | grep Value | awk '{print $3}' | sed 's/\"//g' | sed 's/,//g'`

              if [ $verbose -gt 0 ]; then echo Countdown=$i $debug; fi

            done

            # zet device Basisverlichting uit
            debug=$(curl --url  http://192.168.2.29:8080/json.htm\?type=command\&param=switchlight\&idx=195\&switchcmd=Off)
            if [ $verbose -gt 0 ]
            then
                echo Set device Basisverlichting off  $debug
            fi

            # log actie
            log_message="Timer%20afgelopen,%20Basisverlichting%20uitgezet"
            curl -s --url http://192.168.2.29:8080/json.htm\?type=command\&param=addlogmessage\&message=$log_message

        fi

        # zet timer op deactief
        debug=$(curl -s  --url http://192.168.2.29:8080/json.htm\?type=command\&param=updateuservariable\&vname=TimerBewegingGangActief\&vtype=0\&vvalue=0)

        if [ $verbose -gt 0 ]
        then
            echo Set TimerBewegingGangActief=0  $debug
        fi

        # log actie
        log_message="Timer%20BewegingGang%20gedeactiveerd"
        curl -s --url http://192.168.2.29:8080/json.htm\?type=command\&param=addlogmessage\&message=$log_message

    fi

fi

Stap 5. Potentiometers van de bewegingsmelder ingesteld

Fixed time: 5 minuten (instelling maakt niet uit, wordt overruled door script)

Luminosity: Nachtstand, alleen als de zon onder is detecteert de bewegingsmelder beweging

Sensivity: + om een zo groot mogelijk bereik te hebben waarbinnen de beweging wordt gedetecteerd (mijn gang is 12 meter lang ;-))

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *