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 220v
HLK-PM03 in
HLK-PM03 uit
Wemos D1
Fase
AC
+V0
3v3
Bewegingsmelder
Nuldraad
AC
-V0
GND
Plusdraad
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.
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
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\¶m=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\¶m=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\¶m=addlogmessage\&message=$log_message
# exit script
else
# variable declaratie
#
zonsondergang=`curl --url http://192.168.2.29:8080/json.htm\?type=command\¶m=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\¶m=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\¶m=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\¶m=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\¶m=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\¶m=addlogmessage\&message=$log_message
# start countdown
i=$(curl --url http://192.168.2.29:8080/json.htm\?type=command\¶m=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\¶m=updateuservariable\&vname=TimerBewegingGang\&vtype=0\&vvalue=$i
sleep 1
i=`curl --url http://192.168.2.29:8080/json.htm\?type=command\¶m=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\¶m=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\¶m=addlogmessage\&message=$log_message
fi
# zet timer op deactief
debug=$(curl -s --url http://192.168.2.29:8080/json.htm\?type=command\¶m=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\¶m=addlogmessage\&message=$log_message
fi
fi