Lampensteuerung mit Helligkeit- und Bewegungssensor
Ich wollte meine existierende Lampensteuerung mit Bewegungsmelder um einen Helligkeitssensor erweitern. Meine unsicheren IOT Geräte sind mit einem alten RaspberryPi 1 (txxx) in einem separierten VLAN. In meinem Arbeitszimmer (22) ist der Bewegungsmelder unter meinem Schreibtisch angeschlossen. Dort überwacht ein Script das MQTT Topic das von dem Tasmotachip mit Helligkeitssensor mit der gemessene Helligkeit an den MQTT Server auf txxx gesendet wird.
vi tasmota-22-commander.sh
#!/bin/bash
MQTT_SERVER=txxxx
MQTT_TOPIC="tele/221/lux_/SENSOR"
mosquitto_sub -h $MQTT_SERVER -p 1883 -t $MQTT_TOPIC --qos 2 | xargs -d$'\n' -L1 sh -c '/opt/republish-22-lux.sh $0'
Der “Republish” ist notwendig, da die MQTT Nachrichten von dem Helligkeitssensor nicht mit dem retain flag veröffentlicht werden. Das Script für die Lichtsteuerung prüft die Helligkeit aber nur im Falle einer Bewegung. Die Message wird also an ein zweite Script übergeben das den exakten Helligkeitswert aus der Nachricht extrahiert und in eine Datei schreibt.
#!/bin/sh
echo $1 | jq '.BH1750.Illuminance' > /opt/home-22-lux.txt
# Zukünftig vielleicht
# echo $1 | jq '.BH1750.Illuminance' | mosquitto_pub -h txxxxx -p 1883 -r -t 'home/22/lux' -l
Die eigentliche Lampensteuerung prüft dann im Falle einer Bewegung diesen Helligkeitswert und schaltet dann “wenn es dunkel genug ist” die Lampe ein.
Mit etwas mehr Zeit und Wissen könnte man dies natürlich verfeinern in dem das Bewegungsmelderscript direkt den MQTT Bus abfragt und die Helligkeit extrahiert aber ich wollte es erst einmal funktional in Betrieb bekommen.
Das hier beschriebene Script wird also erweitert und macht die entsprechenden http Aufrufe an meine Sonoff Schalter und meine anderen Lampen.
f = open(file,"/opt/home-22-lux.txt")
lux =f.read()
if Current_State==1 and Previous_State==0 and lux<'30':
print lux
# PIR is triggered
os.system("wget --method=PUT --body-data='{\"on\":true}' http:/.......")
os.system("wget 'http:/.....'")
print " Motion detected!"
# Record previous state
Previous_State=1
time.sleep(300.91)
elif Current_State==0 and Previous_State==1:
# PIR has returned to ready state
print " Ready"
os.system("wget --method=PUT --body-data='{\"on\":false}' http:/.....")
os.system("wget 'http:/....'")
Previous_State=0
# Wait for 10 milliseconds
time.sleep(2.01)
(Ja ich weiß das kann man alles viel schöner machen aber dafür fehlt mir die Zeit und meistens das Wissen)
Als Erweiterung fände ich es interessant ob und wie man den Bewegungsmelder direkt neben den Helligkeitssensor an den NodeMCU CHIP bekommt. Dann könnten ich den vorhandenen Pi woanders verwenden.