Seite 1 von 1

Module und Werte inportieren / exportieren

Verfasst: Montag 6. Mai 2013, 11:13
von The Bang 2
Guten Tag zusammen,

ich bastel gerade an einem Programm rum, dass mir ermöglicht mittels eines TSL45315-Lichtsensors die Raumbeleuchtung zu prüfen und je nach Lichtlevel - eine Funksteckdose via 434-MHz-Empfänger zu schalten. Der Code funktioniert soweit, allerdings habe ich folgendes Problem:

In dem Modul "read_sensor_data" lese ich die Werte datalow, datahigh aus und möchte die - wie im Main zu sehen, in dem Modul "calc_lux" weiterverarbeiten. Allerdings bekomme ich die Übertragung der Werte nicht hin, ohne die Variable als global zu deklarieren (was ja bäh ist). Wie schaffe ich es, dieses Problem zu beheben ohne die Variablen als global zu deklarieren?

Code: Alles auswählen

#!/usr/bin/env python
#Importiere Librarys
from smbus import SMBus
from time import sleep
import os
import subprocess
#Variablen:
bus = SMBus(1)
light_switch_value = 75
socket_on = False

def init():
    #Search for active sensor
    sensor_status = bus.read_byte_data(0x29,0x80)
    if sensor_status != 3:
        #Set sensor to normal operation mode
        bus.write_byte_data(0x29,0x80,0x3)
    	#Set sensor to Time = 400 ms
    	bus.write_byte_data(0x29,0x81,0x01)

def read_sensor_data():
    global datalow, datahigh
    datalow = bus.read_byte_data(0x29,0x84)
    datahigh = bus.read_byte_data(0x29,0x85)

def calc_lux():
    global lux
    lux = 2*((datahigh<<8)+datalow)

def switch_light():
	global lux, socket_on
	if lux > light_switch_value and socket_on == False:
		print "Messwert: ", lux
		print "Messwert uber ", light_switch_value, " - schalte Licht AUS"
		subprocess.call(["sudo", "/home/user/raspberry-remote/send", "11111", "3", "0"], stdout=open(os.devnull, 'wb'))
		socket_on = True
	if lux < light_switch_value and socket_on == True:
		print "Messwert: ", lux
		print "Messwert unter ",light_switch_value, " - schalte Licht EIN"
                subprocess.call(["sudo", "/home/user/raspberry-remote/send", "11111", "3", "1"], stdout=open(os.devnull, 'wb'))
		socket_on = False

def main():
    init()
    while True:
	   read_sensor_data()
	   calc_lux()
	   switch_light()
	   print lux
	   sleep(0.2)

if __name__ == '__main__':
    main()



Re: Module und Werte inportieren / exportieren

Verfasst: Montag 6. Mai 2013, 11:23
von av_jui
Hi

Also ich würde das mit return machen

Code: Alles auswählen

def read_sensor_data():
    datalist = []
    datalist.append(bus.read_byte_data(0x29,0x84))
    datalist.append(bus.read_byte_data(0x29,0x85))
    return  datalist

def calc_lux():
    list = read_sensor_data()
    lux = 2*((list[1]<<8)+list[0])
Ist ungetestet und hat evtl. Schreibfehler.

mfg

Re: Module und Werte inportieren / exportieren

Verfasst: Montag 6. Mai 2013, 11:58
von BlackJack
Ebenfalls ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
import os
import subprocess
from time import sleep
from smbus import SMBus


def init(bus):
    # 
    # Search for active sensor.
    # 
    sensor_status = bus.read_byte_data(0x29, 0x80)
    if sensor_status != 3:
        # 
        # Set sensor to normal operation mode.
        # 
        bus.write_byte_data(0x29, 0x80, 0x03)
        # 
        # Set sensor to Time = 400 ms.
        # 
        bus.write_byte_data(0x29, 0x81, 0x01)


def read_sensor_data(bus):
    low_byte = bus.read_byte_data(0x29, 0x84)
    high_byte = bus.read_byte_data(0x29, 0x85)
    return (high_byte << 8) | low_byte


def switch_light(lux, threshold, socket_on):
    if lux > threshold and not socket_on:
        change = True
    elif lux < threshold and socket_on:
        change = False
    else:
        change = None

    if change is not None:
        print 'Messwert: ', lux
        relation_text, on_off_text = (
            ('uber', 'AUS') if change else ('unter', 'EIN')
        )
        print 'Messwert {0} {1} - schalte Licht {2}'.format(
            relation_text, threshold, on_off_text
        )
        with open(os.devnull, 'wb') as null_file:
            subprocess.call(
                [
                    'sudo',
                    '/home/user/raspberry-remote/send',
                    '11111',
                    '3',
                    str(int(not change))
                ],
                stdout=null_file
            )

    return socket_on if change is None else change


def main():
    threshold = 75
    socket_on = False
    bus = SMBus(1)
    init(bus)
    while True:
        lux = read_sensor_data(bus) * 2
        socket_on = switch_light(lux, threshold, socket_on)
        print lux
        sleep(0.2)


if __name__ == '__main__':
    main()

Re: Module und Werte inportieren / exportieren

Verfasst: Montag 6. Mai 2013, 13:20
von /me
av_jui hat geschrieben:

Code: Alles auswählen

def calc_lux():
    list = read_sensor_data()
    lux = 2*((list[1]<<8)+list[0])
list ist ein ungünstiger Name für einen Bezeichner da du damit das eingebaute list überschreibst.

Re: Module und Werte inportieren / exportieren

Verfasst: Montag 6. Mai 2013, 19:19
von av_jui
/me hat geschrieben:
av_jui hat geschrieben:

Code: Alles auswählen

def calc_lux():
    list = read_sensor_data()
    lux = 2*((list[1]<<8)+list[0])
list ist ein ungünstiger Name für einen Bezeichner da du damit das eingebaute list überschreibst.
Stimmt habe ich garnicht bedacht