I2C Relais Platine PCAL9535A - Modul verfügbar?

Begonnen von hackepeter, 28 Juli 2018, 16:59:21

Vorheriges Thema - Nächstes Thema

hackepeter


Christoph Morrison


LuckyDay

ZitatRPII2C-Modul

Das ist nur der"Treiber" um zugriff auf den I2C Bus zu haben.

Ich hab mir mal die Mühe gemacht , welcher "Baustein" verbaut ist, dazu finde ich kein Modul.

Das sind gängige EIN/AUSGABE Bausteine die direkt von Fhem unterstützt werden, auf der Basis kann man dann fertige Platinen suchen.
PCF8574
I2C_MCP23008
I2C_MCP23017

hackepeter

#3
Vielen Dank für die Antworten!
Das Schalten funktioniert mit dem Modul.
Ich habe zuerst die i2c - Adresse via i2cdetect -y 1 herausgefunden:
http://666kb.com/i/dvlxy2ss0kgt8fmx6.jpg
Anschließend habe mir den Beispielquelltext von Reichelt angeschaut. Mann muss wohl in das Register 06 schreiben:
http://cdn-reichelt.de/documents/datenblatt/A300/103030029_05.pdf

Allerdings schaffe ich es noch nicht, gezielt ein Relais zu schalten.
z.B.:
20 06 00     Rel1 = on, Rel2 = on, Rel3 = on, Rel4 = on
20 06 01     Rel1 = on, Rel2 = on, Rel3 = on, Rel4 = on
20 06 02     Rel1 = on, Rel2 = off, Rel3 = on, Rel4 = on
20 06 03     Rel1 = off, Rel2 = off, Rel3 = on, Rel4 = on
20 06 04     Rel1 = off, Rel2 = off, Rel3 = on, Rel4 = on
20 06 05     Rel1 = off, Rel2 = on, Rel3 = off, Rel4 = on
20 06 06     Rel1 = on, Rel2 = off, Rel3 = off, Rel4 = on
....
Die Register sind hier erklärt, aber aktuell stehe ich noch etwas auf dem Schlauch:
http://cdn-reichelt.de/documents/datenblatt/A300/103030029_04.pdf

Zitat von: fhem-hm-knecht am 28 Juli 2018, 22:35:13
Das ist nur der"Treiber" um zugriff auf den I2C Bus zu haben.

Ich hab mir mal die Mühe gemacht , welcher "Baustein" verbaut ist, dazu finde ich kein Modul.

Das sind gängige EIN/AUSGABE Bausteine die direkt von Fhem unterstützt werden, auf der Basis kann man dann fertige Platinen suchen.
PCF8574
I2C_MCP23008
I2C_MCP23017

Jetzt verstehe ich. Verbaut ist ein PCAL9535A . Das I2C_PCF8574 - Modul habe ich mal getestet - funktioniert leider nicht.
Also hätte ich nur die unschöne Möglichkeit das Python Script, welches der Hersteller liefert (siehe oben), so umzubauen, dass es von FHEM via {System...} aufgerufen werden kann - mit Parameter welches Relais wie geschaltet werden soll...

hackepeter

#4
Ich habe nun das Script geschrieben, welches die Relais schalten kann. Aufgerufen wird das Script auf der Kommandozeile wie folgt:
i2c_relais.py <relaisNr> <0=off 1=on>
Der Aufruf um das erste Relais einzuschalten: python i2c_relais.py 1 1
Vor der ersten Benutzung muss unter /home/pi eine Datei  i2c_busData.txt erstellt werden. In diesem File wird der letzte Registereintrag gespeichert. Anschließend müssen noch Berechtigungen gesetzt werden: chmod 777 i2c_busData.txt.
In FHEM kann das Script z.B. wie folgt aufgerufen werden:
{system('python /home/pi/i2c_relais.py 1 1&');;}
import time
import smbus
import signal
import sys
global bus
bus = smbus.SMBus(1) # Bus auf dem RPI 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1)
DEVICE_ADDRESS = 0x20 #eingestellte 7 bit Busadresse
DEVICE_REG_MODE1 = 0x06 #Register 06 zur Ansteuerung der Relais

argv1 = int(sys.argv[1]) #argument 1 in Variable speichern
argv1 = argv1 - 1
#print argv1
with open('/home/pi/i2c_busData.txt', 'r') as temp_file: #Datei oeffnen
        DEVICE_REG_DATA = temp_file.read(3) #3Byte aus der Datei Lesen
        DEVICE_REG_DATA = int(DEVICE_REG_DATA) #ausgelesenen string in int konvertieren
        temp_file.close() #Datei schliessen
#print str(DEVICE_REG_DATA)
if int(sys.argv[1])==0: #wenn der erste parameter 0 ist...
        DEVICE_REG_DATA = 255 # dann alles ausschalten
else: #ansonsten:
        if int(sys.argv[2])==1:
                #DEVICE_REG_DATA &= ~(0x1<<int(sys.argv[1]))
                DEVICE_REG_DATA &= ~(0x1<<argv1)
                print 'RelaisNr.'+ sys.argv[1] + ' eingeschaltet' #+ str(DEVICE_REG_DATA)
        if int(sys.argv[2])==0:
                #DEVICE_REG_DATA |= (0x1<<int(sys.argv[1]))
                DEVICE_REG_DATA |= (0x1<<argv1)
                print 'RelaisNr.'+ sys.argv[1] + ' ausgeschaltet' #+ str(DEVICE_REG_DATA)
bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG_MODE1, DEVICE_REG_DATA) #Daten in Register schreiben
with open('/home/pi/i2c_busData.txt', 'w') as temp_file: #Datei oeffnen
        temp_file.write(str(DEVICE_REG_DATA)) #DEVICE_REG_DATA in Datei schreiben
        temp_file.close() #Datei schliessen
sys.exit()
signal.signal(signal.SIGINT, endProcess)


Es ist zu empfehlen, bei einem Neustart alle Reails auszuschalten. Dazu einfach das Script als cronjob mit Parameter 0 0 starten:
python /home/pi/i2c_relais.py 0 0