Module und Werte inportieren / exportieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
The Bang 2
User
Beiträge: 14
Registriert: Montag 11. März 2013, 12:30

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()


av_jui
User
Beiträge: 25
Registriert: Samstag 4. Mai 2013, 12:45

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
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()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
av_jui
User
Beiträge: 25
Registriert: Samstag 4. Mai 2013, 12:45

/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
Antworten