#Beispiel Relais.py
  #https://www.anhahe.de/
  #sudo apt-get install python-smbus
  #Unter Einstellung/Rasperry-Pi-Konfiguration IC2 Aktivieren
  #sudo Pinout Listet all Pin
  #sudo i2cdetect -l gibt I2C Adapter aus
  #sudo i2cdetect -y 1 RPI ist Revision 2 deswegen 1
  from tkinter import *
  import smbus
  import time
  import RPi.GPIO as GPIO
  # Open the bus
  bus = smbus.SMBus(1)            #Revision 2
  #MCP23008
  MCP23008address         =0x20   # MCP23008 Adress IC2
  MCP23008RegisterIODIR   =0x00   # Register IODIR MCP23008  IO7 IO6 IO5 IO4 
  MCP23008RegisterIPOL    =0x01   # Register IPOL MCP23008  IP7 IP6 IP5 IP4 IP3 
  MCP23008RegisterGPINTEN =0x02   # Register GPINTEN MCP23008 GPINT7 
  MCP23008RegisterDEFVAL  =0x03   # Register DEFVAL MCP23008 DEF7 DEF6 
  MCP23008RegisterINTCON  =0x04   # Register INTCON MCP23008 IOC7 IOC6 
  MCP23008RegisterIOCON   =0x05   # Register IOCON MCP23008 — — SREAD 
  MCP23008RegisterGPPU    =0x06   # Register GPPU MCP23008  PU7 PU6 PU5 
  MCP23008RegisterINTF    =0x07   # Register INTF MCP23008 INT7 INT6 INT5 
  MCP23008RegisterINTCAP  =0x08   # Register INTCAP MCP23008  ICP7 ICP6 
  MCP23008RegisterGPIO    =0x09   # Register GPIO MCP23008 GP7 GP6 GP5 
  MCP23008RegisterOLAT    =0x0A   # Register OLAT MCP23008  OL7 OL6 OL5 
  # Set up the pins as output
  #Address pins are always enabled on MCP23008. MCP23S08 IOCON muss bit 3 
  bus.write_byte_data( MCP23008address, MCP23008RegisterIODIR, 0x00 )         
  #Setzt MCP23008 auf I/O Ausgang (Outout)
  bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, 0x00 )          
  #alle Relais aus 0x00 beim Starten
  #Operator
  Bezeichnung
                          Beispiel
  #~x
          Bitweises Not
             Ausgabe=0x03 also b0000 0011 (Taste auf 
  #Tastertur AltGr +*)
  #                                               Ausgabe=Ausgabe & ~0x01 (also b0000 0001) 
  #Ausgabe: 0x02 (b0000 0010)
  #|x
          Binary OR
                          Ausgabe=0x03 (Taste auf Tastertur AltGr 
  #<>)
  #                                               Ausgabe=Ausgabe & ~0x04  Ausgabe: 0x07
  #https://wiki.python.org/moin/BitwiseOperators
  def Relais():
      global Ausgabe
      Ausgabe=0x00
      if (CheckVar1.get()==0):
          Ausgabe=Ausgabe & ~0x01
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe ) 
  # Relais1 Ausschalten
      if (CheckVar1.get()==1):
          Ausgabe=Ausgabe | 0x01
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe ) 
  # Relais1    Einschalten
      if (CheckVar2.get()==0):
          Ausgabe=Ausgabe & ~0x02
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar2.get()==1):
          Ausgabe=Ausgabe | 0x02
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar3.get()==0):
          Ausgabe=Ausgabe & ~0x04
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar3.get()==1):
          Ausgabe=Ausgabe | 0x04
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar4.get()==0):
          Ausgabe=Ausgabe & ~0x08
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar4.get()==1):
          Ausgabe=Ausgabe | 0x08
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar5.get()==0):
          Ausgabe=Ausgabe & ~0x10
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar5.get()==1):
          Ausgabe=Ausgabe | 0x10
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar6.get()==0):
          Ausgabe=Ausgabe & ~MCP23008address
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar6.get()==1):
          Ausgabe=Ausgabe | MCP23008address
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar7.get()==0):
          Ausgabe=Ausgabe & ~0x40
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar7.get()==1):
          Ausgabe=Ausgabe | 0x40
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
      if (CheckVar8.get()==0):
          Ausgabe=Ausgabe & ~0x80
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe ) 
  # Relais 8 Ausschalten
      if (CheckVar8.get()==1):
          Ausgabe=Ausgabe | 0x80
          bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe ) 
  # Relais 8 Einschalten
  # Ein Fenster erstellen
  fenster = Tk()
  #Checkbox 8 Stück mit pack ins Fenster zeichen mit place die Position
  CheckVar1 = IntVar()
  C1 = Checkbutton(fenster, text = "Relais 1", variable = CheckVar1,command=Relais)
  C1.pack()
  C1.place(x=50, y=50)                                                #von oben links
  CheckVar2 = IntVar()
  C2 = Checkbutton(fenster, text = "Relais 2", variable = CheckVar2,command=Relais)
  C2.pack()
  C2.place(x=50, y=75)
  CheckVar3 = IntVar()
  C3 = Checkbutton(fenster, text = "Relais 3", variable = CheckVar3,command=Relais)
  C3.pack()
  C3.place(x=50, y=100)
  CheckVar4 = IntVar()
  C4 = Checkbutton(fenster, text = "Relais 4", variable = CheckVar4,command=Relais)
  C4.pack()
  C4.place(x=50, y=125)
  CheckVar5 = IntVar()
  C5 = Checkbutton(fenster, text = "Relais 5", variable = CheckVar5,command=Relais)
  C5.pack()
  C5.place(x=50, y=150)
  CheckVar6 = IntVar()
  C6 = Checkbutton(fenster, text = "Relais 6", variable = CheckVar6,command=Relais)
  C6.pack()
  C6.place(x=50, y=175)
  CheckVar7 = IntVar()
  C7 = Checkbutton(fenster, text = "Relais 7", variable = CheckVar7,command=Relais)
  C7.pack()
  C7.place(x=50, y=200)
  CheckVar8 = IntVar()
  C8 = Checkbutton(fenster, text = "Relais 8", variable = CheckVar8,command=Relais)
  C8.pack()
  C8.place(x=50, y=225)
  # Fenster Breite, Höhe
  w = 1000                                                # Breite  Tk fenster
  h = 650                                                 # Höhe  Tk fenster
  # Lese Bildschirm Auflösung
  ws = fenster.winfo_screenwidth()                        # Breite Auflösung vom Bildschirm
  hs = fenster.winfo_screenheight()                       # Höhe
  # Berechnung der Mitte
  x = (ws/2) - (w/2)
  y = (hs/2) - (h/2)
  fenster.geometry('%dx%d+%d+%d' % (w, h, x, y))          # Setz Fenster in Mitte
  fenster.resizable(0,0)                                  # Fenster ist in der Groesse nicht 
  veraenderbar
  fenster.title("Steuerung UniPi www.AnHaHe.de")          #Beschriftung Kopfzeile
  buttonschliessen = Button(fenster, text='Fenster Schliessen', width=25, 
  command=fenster.destroy)
  buttonschliessen.pack()
  buttonschliessen.place(x=745, y=620)
  fenster.mainloop()