Das kommt jetzt darauf an was das für I2C-Module sind.
Ich nehme an alle Lichter werden von deinem Programm gesteuert
dann weiß dein Programm zu jedem Zeitpunkt den Schaltzustand von jedem bit.
Da muss nix zurückgelesen werden. Wenn du ein Bit änderst dann macht das dein Programm. Und dann weiß dein Programm auch den Schaltzustand vor dem ändern und nach dem ändern.
Wenn es dein Programm nicht weiß dann musst du ihm eben einen "Notizblock" zur Verfügung stellen in Form einer Variablen in der der momentane Schaltzustand gespeichert ist, und dann wird nur der Inhalt dieser Variablen geändert und an deinen I2C-IO-Expander übertragen.
Das beste ist du postest deinen kompletten Code als code-section
Komplett heißt wirklich KOMPLETT auch wenn dein Code 2000 Zeilen hat.
vgs