Dateien nach "/" hochladen

check in
This commit is contained in:
2026-04-06 15:59:35 +00:00
commit 1836997aac
3 changed files with 211 additions and 0 deletions

43
relays.py Normal file
View File

@@ -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

40
sensors.py Normal file
View File

@@ -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

128
zazalab.py Normal file
View File

@@ -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}")
'''