commit 1836997aac1eccdf939d0a6e190964734682f495 Author: ralf.nitsch Date: Mon Apr 6 15:59:35 2026 +0000 Dateien nach "/" hochladen check in diff --git a/relays.py b/relays.py new file mode 100644 index 0000000..8a2a1ad --- /dev/null +++ b/relays.py @@ -0,0 +1,43 @@ +#import RPi.GPIO as GPIO +import time +import subprocess + +Relay = [5, 6, 13, 16, 19, 20, 21, 26] +All_Relays = "5,6,13,16,19,20,21,26" +ON = 1 +OFF = 0 +# GPIO.HIGH -> relay off +# GPIO.LOW -> relay on + +#GPIO.setmode(GPIO.BCM) +#GPIO.setwarnings(False) + + +def init(): + # alle Relais auf output und ausschalten + res = subprocess.run(["pinctrl", All_Relays, "op", "dh"]) + + +def on(id): +# GPIO.output(Relay[id], GPIO.LOW) + res = subprocess.run(["pinctrl", f"{Relay[id]}", "op", "dl"]) + +def off(id): +# GPIO.output(Relay[id], GPIO.HIGH) + res = subprocess.run(["pinctrl", f"{Relay[id]}", "op", "dh"]) + +def setOnOff(id, state): + if state==ON: + on(id) + elif state==OFF: + off(id) + +def onoffstatus(id): + res = subprocess.run(["pinctrl", "lev", f"{Relay[id]}"], capture_output=True, text=True) + if res.returncode == 0: + out = int(res.stdout) + if out == 1: + return OFF + if out == 0: + return ON + raise ValueError diff --git a/sensors.py b/sensors.py new file mode 100644 index 0000000..6df43aa --- /dev/null +++ b/sensors.py @@ -0,0 +1,40 @@ +import smbus2 +import bme280 +import time + +# I2C bus ini initialisieren +bus = smbus2.SMBus(1) + +class EnvironmentSensor: + def __init__(self, addr): + self.addr = addr + + def temperature(self): + return bme280.sample(bus, self.addr).temperature + def humidity(self): + return bme280.sample(bus, self.addr).humidity + def pressure(self): + return bm2280.sample(bus, self.addr).pressure + +env=[EnvironmentSensor(0x76), EnvironmentSensor(0x77)] + +lightMeasurementTime=0.2 + +def readBH1750(bus, addr = 0x23): + bus.write_byte(addr, 0x01) # power on + bus.write_byte(addr, 0x20) # set high res onetime measurement mode + time.sleep(lightMeasurementTime) # 0.1 should already be enough time for measurement + data = bus.read_i2c_block_data(addr, 0, 2) # get measurement result + return ((data[0] << 8) + data[1]) / 1.2 # factor 1.2 is from sensor datasheet + + +def illuminance(): + return readBH1750(bus) + +def environment(sensor): + if sensor == 0: + return bme280.sample(bus, 0x76) + elif sensor == 1: + return bme280.sample(bus, 0x77) + else: + raise ValueError diff --git a/zazalab.py b/zazalab.py new file mode 100644 index 0000000..1d78815 --- /dev/null +++ b/zazalab.py @@ -0,0 +1,128 @@ +#!/home/ralf/python/zazalab/venv/bin/python +# -*- coding:utf-8 -*- + +#import morse +import relays +import sensors +import time +#import RPi.GPIO as GPIO +import argparse + +class ArgumentParser(argparse.ArgumentParser): + def _check_value(self, action, value): + if value is action.default: + return + return super()._check_value(action, value) + + +''' +env0 = sensors.environment(0) +env1 = sensors.environment(1) +lux = sensors.illuminance() + +# Ausgabe der Messwerte +print("Sensor Umwelt 0:") +print(f"Temperatur: {env0.temperature:.2f} °C") +print(f"Luftfeuchtigkeit: {env0.humidity:.0f} %") +print(f"Luftdruck: {env0.pressure:.0f} hPa") +print() + +print("Sensor Umwelt 1:") +print(f"Temperatur: {env1.temperature:.2f} °C") +print(f"Luftfeuchtigkeit: {env1.humidity:.0f} %") +print(f"Luftdruck: {env1.pressure:.0f} hPa") + +print() +print("Sensor Beleuchtung:") +print(f"Beleuchtungsstärke: {lux:.2f} lux") +''' + +def initFunc(args): + relays.init() + +def setFunc(args): + for relay in args.relay: + if args.state == 'on': + relays.on(relay) + else: + relays.off(relay) + +def getFunc(args): + if args.subparser == 'relay': + for i in args.relay: + if args.header == True: + print(f'Relay {i}:') + print(relays.onoffstatus(i)) + return + if ['temperature', 'pressure', 'humidity', 'sensor'].count(args.subparser) != 0: + if args.unit == True: + units = ['°C', '%', 'mbar', 'lux'] + else: + units = ['', '', '', ''] + for i in args.sensortype: + if args.header == True: + print(f'Sensor {i}:') + if i < 2: + env = sensors.environment(i) + if args.subparser == 'temperature' or args.subparser == 'sensor': + print(f'{env.temperature:.2f} {units[0]}') + if args.subparser == 'humidity' or args.subparser == 'sensor': + print(f'{env.humidity:.2f} {units[1]}') + if args.subparser == 'pressure' or args.subparser == 'sensor': + print(f'{env.pressure:.2f} {units[2]}') + elif i == 2: + light = sensors.illuminance() + print(f'{light:0.0f} {units[3]}') + else: + raise ValueError + + +#relays.init() + +# local ArgumentParser +parser = ArgumentParser( + prog = 'zazactl', + description = 'Auslesen der am Raspberry Pi angeschlossenen Sensoren und Steuerung der Relais.', + epilog = '' + ) + +subparsers = parser.add_subparsers(required = True) +subparserGet = subparsers.add_parser('get', help = 'type ''get -h'' for more help') +subparserGet.add_argument('-u', dest='unit', default=False, action='store_true', help='show values with units') +subparserGet.add_argument('-s', dest='header', default=False, action='store_true', help='show sensor number') +subparserGetSubs = subparserGet.add_subparsers(required = True, dest='subparser') +subparserGetTemperature = subparserGetSubs.add_parser('temperature') +subparserGetTemperature.add_argument('sensortype', metavar='sensornumber', type=int, choices=[0, 1], default=[0, 1], nargs='*', help='sensor number(s): 0, 1') +subparserGetTemperature.set_defaults(func = getFunc) +subparserGetHumidity = subparserGetSubs.add_parser('humidity') +subparserGetHumidity.add_argument('sensortype', metavar='sensornumber', type=int, choices=[0, 1], default=[0, 1], nargs='*', help='sensor number(s): 0, 1') +subparserGetHumidity.set_defaults(func = getFunc) +subparserGetPressure = subparserGetSubs.add_parser('pressure') +subparserGetPressure.add_argument('sensortype', metavar='sensornumber', type=int, choices=[0, 1], default=[0, 1], nargs='*', help='sensor number(s): 0, 1') +subparserGetPressure.set_defaults(func = getFunc) +subparserGetSensor = subparserGetSubs.add_parser('sensor') +subparserGetSensor.add_argument('sensortype', metavar='sensornumber', type=int, choices=[0, 1, 2], default=[0, 1, 2], nargs='*', help='sensor number(s): 0, 1, 2') +subparserGetSensor.set_defaults(func = getFunc) +subparserGetRelay = subparserGetSubs.add_parser('relay') +subparserGetRelay.add_argument('relay', metavar='relaynumber', type=int, choices=range(0,6), default=range(0,6), nargs='*', help='relay number(s): 0-7 (6 and 7 not connected to plugs)') +subparserGetRelay.set_defaults(func = getFunc) + +subparserSet = subparsers.add_parser('set', help = 'set help') +subparserSetSubs = subparserSet.add_subparsers(required = True) +subparserSetRelay = subparserSetSubs.add_parser('relay') +subparserSetRelay.add_argument('relay', metavar = 'relaynumber', type=int, choices=range(0,6), nargs='*', default=range(0,6), help = 'relay number(s) in the range 0..7') +subparserSetRelay.add_argument('state', choices=('on', 'off')) +subparserSetRelay.set_defaults(func = setFunc) + +subparserInit = subparsers.add_parser('init', help = 'init help') +subparserInit.set_defaults(func = initFunc) +args = parser.parse_args() +args.func(args) + +''' +#relays.init() +#morse.morse("eis eis", 1) +for i in range(0, 8): + status = relays.onoffstatus(i) + print(f"no:{i}, status:{status}") +'''