Voor de aansturing van o.a. een zonnescherm wilde ik in Domoticz kunnen gebruik maken van de lichtsterkte. Na wat zoeken kwam ik uit bij een simpele lux meter welke voor Arduino en RaspberyyPI gebruikt kan worden: BH1750FVI. Deze heb ik via ebay gekocht (€1,49). Na 2 weken geduld is deze bezorgd, het betreft een simpel bordje. Deze heb ik vervolgens met kabeltje gesoldeerd op de PIN's van de RPI volgens deze website: http://www.raspberrypi-spy.co.uk/2015/03/bh1750fvi-i2c-digital-light-intensity-sensor/

Hierna kon ik met het python script wat ook op die website staat gelijk al de lux meter uitlezen, dit script werkt mooi als demo maar praktisch was het niet. Het zit in een loop en blijft de lux stand doorgeven totdat je het script onderbreekt. Ik gebruik Domoticz voor de aansturing van domotica apparatuur en wilde deze lux waardes in de software kunnen gebruiken voor metingen en vergelijkingen. Er is geen rechtstreekse ondersteuning voor deze  BH1750FVI sensor maar je kan Domiticz sensors ook vullen met info door een post te doen. Om de lux waarde's te kunnen opslaan heb ik 2 virtual LUX devices aangeaakt. Waarom 2? Ik wil de lux waarde van 2 moment kunnen vergelijken. Hiermee kan je voorkomen dat je je zonnescherm in of uit doet omdat er alleen een wolk voor de zon zit ofzo. Deze virtual device's heb ik LUX1 en LUX2 genoemd, daarna heb ik van beide sensors het ID genoteerd uit het device overzicht.

domitcz-lux1

 

Vervolgens heb ik met de info uit deze wiki pagina van Domoticz (http://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s) de juiste URL samengesteld om de gegevens te kunnen posten. Deze heb ik aangevuld met de juiste paramaters om als curl cmd te kunnen uitvoeren:

Voorbeeld, met onderstaan command wordt lux sensor met id 7 geupdate met de waarde 700.

curl -s -i -H "Accept: application/json" "http://127.0.0.1:80/json.htm?type=command&param=udevice&idx=7&svalue=700"

Als je dit test dan krijg je een Ok melding terug, als je een fout krijgt loop dan voor je device ID na.

 

Deze informatie heb ik gecombineerd met het eerder gevonden python script. Dit script heb ik aangepast zodat de loop eruit is gehaald, daarna heb ik  een stuk code toegevoegd waarmee ik het CURL commando samen stel met de waarde uit de lux meter. Daarna wordt er een post uitgevoerd. Het is niet de mooiste oplossing maar het werkt wel goed. Dit script heb ik 2x gemaakt, 1x voor LUX1 en 1x voor LUX2 device's in domoticz. Dit script staat onderaan deze pagina.

 

Beide script heb ik vervolgens in de system crontab toegevoegd door de crontab te openen met sudo crontab -e

*/4 * * * * python /home/pi/lux1.py

*/4 * * * * sleep 120 && python /home/pi/lux2.py

 

Beide scripts worden om de 4 minuten uitgevoerd maar voordat het 2e script wordt uitgevoerd wordt er eerst 2 minuten gewacht, hierdoor worden beide LUX devices elke 4 minuten geupdate met een verschil van 2 minuten. Dit verschil kan weer worden gebruikt voor lux vergelijkingen. Als je de script dan enige tijd hebt lopen krijg je mooie grafieken.

domitcz-lux2

Script:

#!/usr/bin/python

#--------------------------------------

#    ___  ___  _ ____          

#   / _ \/ _ \(_) __/__  __ __ 

#  / , _/ ___/ /\ \/ _ \/ // / 

# /_/|_/_/  /_/___/ .__/\_, /  

#                /_/   /___/   

#

#           bh1750.py

#  Read data from a digital light sensor.

#

# Author : Matt Hawkins

# Date   : 15/04/2015

#

# http://www.raspberrypi-spy.co.uk/

#

#--------------------------------------

import smbus

import time

import os

# Define some constants from the datasheet

 

DEVICE     = 0x23 # Default device I2C address

 

POWER_DOWN = 0x00 # No active state

POWER_ON   = 0x01 # Power on

RESET      = 0x07 # Reset data register value

 

# Start measurement at 4lx resolution. Time typically 16ms.

CONTINUOUS_LOW_RES_MODE = 0x13

# Start measurement at 1lx resolution. Time typically 120ms

CONTINUOUS_HIGH_RES_MODE_1 = 0x10

# Start measurement at 0.5lx resolution. Time typically 120ms

CONTINUOUS_HIGH_RES_MODE_2 = 0x11

# Start measurement at 1lx resolution. Time typically 120ms

# Device is automatically set to Power Down after measurement.

ONE_TIME_HIGH_RES_MODE_1 = 0x20

# Start measurement at 0.5lx resolution. Time typically 120ms

# Device is automatically set to Power Down after measurement.

ONE_TIME_HIGH_RES_MODE_2 = 0x21

# Start measurement at 1lx resolution. Time typically 120ms

# Device is automatically set to Power Down after measurement.

ONE_TIME_LOW_RES_MODE = 0x23

 

#bus = smbus.SMBus(0) # Rev 1 Pi uses 0

bus = smbus.SMBus(1)  # Rev 2 Pi uses 1

 

def convertToNumber(data):

  # Simple function to convert 2 bytes of data

  # into a decimal number

  return ((data[1] + (256 * data[0])) / 1.2)

 

def readLight(addr=DEVICE):

  data = bus.read_i2c_block_data(addr,ONE_TIME_HIGH_RES_MODE_1)

  return convertToNumber(data)

 

def main():

 

 

  #while True:

    print "Light Level : " + str(readLight()) + " lx"

  #  time.sleep(0.5)

cu1 = 'curl -s -i -H "Accept: application/json" "http://127.0.0.1:80/json.htm?type=command&param=udevice&idx=7&svalue='

cu2 = str(readLight())

cu3 = '"'

cu = cu1 + cu2 +  cu3

# retvalue = os.system('curl -s -i -H "Accept: application/json" "http://127.0.0.1:80/json.htm?type=command&param=udevice&idx=7&svalue=700"')

retvalue = os.system(cu)

print retvalue  

if __name__=="__main__":

   main()