[52_I2C_OLED] Modul zu Ansteuerung von OLED-Displays am Raspberry Pi

Begonnen von Standarduser, 22 September 2018, 20:36:28

Vorheriges Thema - Nächstes Thema

Standarduser

Ich habe ein kleines Modul geschrieben, mit dem es möglich ist, direkt aus FHEM heraus Textinformationen auf ein OLED-Display, das per I2C an den RPi angeschlossen ist, zu schreiben.
Bei mir läuft es seit einigen Tagen und so dachte ich, ich stelle es Euch mal vor. Vielleicht kann ja der ein oder andere etwas damit anfangen.

Zur Installation einfach die Datei 52_I2C_OLED.pm in das Verzeichnis /opt/fhem/FHEM kopieren und anschließend ein reload 52_I2C_OLED.pm in FHEM absetzen.

Das Modul erklärt sich im Prinzip fast von selbst. Dennoch nachfolgend der Text für die Commandref (auch im Modul enthalten):

ZitatI2C_OLED

Das Modul I2C_OLED dient zur Ansteuerung von OLED-Displays, die über I2C an einen Raspberry Pi angeschlossen sind.
Unterstützt werden Displays mit SSD1306- oder SH1106-Chip, 128 Pixeln in der Breite und 32 oder 64 Pixel in der Höhe.

Funktionsweise:
Das Display wird in Zeilen aufgeteilt, dabei ist die Anzahl der Zeilen frei wählbar (1...6). Jede Zeile kann einzeln
mit beliebigem Text beschrieben werden. Um den Umgang mit Messwerten zu erleichtern, kann man in den
Attributen je Zeile ein Präfix und ein Suffix festlegen. Damit ist es beispielsweise möglich, per Notify nur einen
Zahlenwert auf das Display zu schreiben und dennoch einen sinnvollen Zusammenhang herstellen.
Nimmt man zum Beispiel einen einfachen Temperaturwert "10", so kann man mit dem Präfix "Temperatur:" und dem
Suffix "°C" folgende Ausgabe auf dem Display erzeugen: "Temperatur: 10 °C".

Vorraussetzungen:
Zur Ansteuerung des Displays wird die Bibliothek HiPi::Interface::MonoOLED benötigt, die sich mit folgenden
Kommandozeilen-Befehlen installieren lässt:

  • sudo dpkg --install libhipi-perl_0.72-1_armhf.deb
  • sudo apt-get -y -f install
Außerdem wird eine funktionierende Instanz von RPII2C benötigt, um Zugriff auf den I2C-Bus zu erhalten.

Define
define <name> I2C_OLED <type> <size-x> <size-y> <address>

Bei der Definition sind Displaytyp, Anzahl der Pixel in Breite und Höhe, sowie die I2C-Adresse anzugeben.
Die I2C-Adresse lässt sich mit folgendem Kommandozeilenbefehl ermitteln:
i2cdetect -y 1

Erlaubte Werte:

  • type: SSD1306 oder SH1106
  • size-x: 128
  • size-y: 32 oder 64
  • address: im Format 0x..

Beispiel: define oled SSD1306 I2C_OLED 128 64 0x3c

Set

  • OnOff: Schaltet das Display ein/aus.
  • contrast: Kontrasteinstellung für das Display. Erlaubt ist ein Zahlenbereich zwischen 0...255.
  • flip: Spiegelt die Darstellung auf dem Display. Mögliche Werte sind 1 (spiegeln) und 0 (normal).
  • invert: Invertiert das Display. Dabei wird der Hintergrund hell und die Schrift schwarz.
  • text_line1: Text, der in Zeile 1 geschrieben werden soll.
  • text_line2: Text, der in Zeile 2 geschrieben werden soll.
  • text_line3: Text, der in Zeile 3 geschrieben werden soll.
  • text_line4: Text, der in Zeile 4 geschrieben werden soll.
  • text_line5: Text, der in Zeile 5 geschrieben werden soll.
  • text_line6: Text, der in Zeile 6 geschrieben werden soll.
  • update: Erzwingt das aktualisieren des Displays (nur in Ausnahmefällen nötig).

Get
Keine Befehle verfügbar.

Attribute

  • OLED_Lines: Anzahl der Zeilen, die auf dem Display angezeigt werden sollen (1...6).
  • OLED_Font: Schriftart für den Text auf dem Display.
  • OLED_FontSize: Schriftgröße (sollte passend zur Anzahl der Zeilen gewählt werden).
  • OLED_text_line1_prefix: Zusätzlicher Text, der auf Zeile 1 vor einem Messwert angezeigt werden soll.
  • OLED_text_line1_suffix: Zusätzlicher Text, der auf Zeile 1 hinter einem Messwert angezeigt werden soll.
  • OLED_text_line2_prefix: Zusätzlicher Text, der auf Zeile 2 vor einem Messwert angezeigt werden soll.
  • OLED_text_line2_suffix: Zusätzlicher Text, der auf Zeile 2 hinter einem Messwert angezeigt werden soll.
  • OLED_text_line3_prefix: Zusätzlicher Text, der auf Zeile 3 vor einem Messwert angezeigt werden soll.
  • OLED_text_line3_suffix: Zusätzlicher Text, der auf Zeile 3 hinter einem Messwert angezeigt werden soll.
  • OLED_text_line4_prefix: Zusätzlicher Text, der auf Zeile 4 vor einem Messwert angezeigt werden soll.
  • OLED_text_line4_suffix: Zusätzlicher Text, der auf Zeile 4 hinter einem Messwert angezeigt werden soll.
  • OLED_text_line5_prefix: Zusätzlicher Text, der auf Zeile 5 vor einem Messwert angezeigt werden soll.
  • OLED_text_line5_suffix: Zusätzlicher Text, der auf Zeile 5 hinter einem Messwert angezeigt werden soll.
  • OLED_text_line6_prefix: Zusätzlicher Text, der auf Zeile 6 vor einem Messwert angezeigt werden soll.
  • OLED_text_line6_suffix: Zusätzlicher Text, der auf Zeile 6 hinter einem Messwert angezeigt werden soll.

Den Entwicklungsstand dieses Moduls würde ich im Moment irgendwo zwischen alpha und beta sehen. Die eingebauten Funktionen laufen bei mir einwandfrei, aber ganz zu Ende entwickelt ist es dann doch noch nicht. Eine englische Commandref werde ich später im Modul integrieren. Der nächste Entwicklungsschritt soll sein, dass ein Diagramm direkt auf dem Display angezeigt wird. Dafür hab ich auch schon eine Lösung, ich muss sie nur noch umsetzen.

Das angehängte Bild zeigt mein Display, konfiguriert für 5 Zeilen mit der Schriftgröße 15.

Standarduser

Ich habe das Modul ein wenig überarbeitet. Neue Version im ersten Post.

dman

Super Modul, funktioniert gut und ist sehr einfach zu handhaben. Danke!

dman

Vielleicht noch eine Anregung: Wenn ohne angeschlossenem Display definiert wird oder ein definiertes Display nicht mehr angeschlossen ist, dann läuft FHEM insgesamt nicht (stürzt ab im ersten Fall oder startet nicht im zweiten Fall). Vielleicht kann man den Fehler noch abfangen.

anschristian

 :) Super das du dir die Arbeit gemacht hast weiter so hat auf anhieb funktioniert und kann jetzt endlich die kleinen Displays benutzten.

Eine Frage hätte ich bevor ich weiter mach kann man eigentlich mehr als eines definieren ?
Ist vielleicht eine dumme frage aber einzeln angesteckt haben alle immer die gleiche Adresse die müsste man dann ändern geht das überhaupt?
Habs mit i2C nicht so um genau zu sein war das der erste Versuch mit dem Oled Display 128x64 und das hat ja dank dir gleich mal super funktioniert.

Standarduser

Hi. Theoretisch müsste das Modul mit zwei Instanzen auch zwei Displays steuern können. Aber das habe ich nie ausprobiert, da ich nur ein Display besitze.
Wenn du zwei Displays ansteuern willst, dann benötigen die auch zwei unterschiedliche Adressen.

Ich meine, dass man bei einigen Displays die Adresse durch Umlöten eines Widerstandes ändern kann. Aber sicher bin ich mir da nicht und ich kann auch nicht sagen, bei welchem das der Fall sein könnte.

dman

noch was zu meiner Anregung der Fehlerbehandlung. Mit folgendem Zusatz kann man prüfen, ob an einer erwarteten I2C-Adresse ($address) ein device im bus ist:

use HiPi qw( :i2c );
use HiPi::Device::I2C;
my $dev = HiPi::Device::I2C->new;
my $present = $dev->check_address($address);

man kann dann im Definitionsteil ggf. mit folgendem aussteigen:

if ($present != 1) {return "kein Device an der angegebenen Adresse";}

Standarduser

Hi d-man,

ich habe mir das gerade mal angeschaut, allerdings funktioniert der von dir vorgeschlagene Check bei mir nicht. Das Ergebnis ist immer negativ, auch wenn das Display angeschlossen ist und die Adresse stimmt.
Hast du das selber schonmal ausprobiert?

dman

Hm, ja, bei mir funktioniert es. Ich habe es in Dein Modul eingebaut. Habe das zuerst etwas anders versucht und dann ein nicht nachvollziehbares merkwürdiges Verhalten gehabt. Schließlich habe ich $dev global definiert. 

Also die ersten 3 Zeilen am Anfang und die beiden letzten Zeilen innerhalb I2C_OLED_Define nach den Checks bzgl. x und y.

use List::Util qw(min max);

use HiPi qw( :i2c );
use HiPi::Device::I2C;
my $dev = HiPi::Device::I2C->new;

my %sets = (
"flip" => "1,0",
"displayOnOff" => "on,off",
"invert" => "normal,inverted",
"contrast" => "",
"diagram_values" => "",
"text_line1" => "",
"text_line2" => "",
"text_line3" => "",
"text_line4" => "",
"text_line5" => "",
"text_line6" => "",
"update" => "noArg",
);

my %gets = (
);

my %repl = (
"«" => "\xAB",
"°" => "\xB0",
"±" => "\xB1",
"²" => "\xB2",
"³" => "\xB3",
"µ" => "\xB5",
"·" => "\xB7",
"¹" => "\xB9",
"º" => "\xBA",
"»" => "\xBB",
"¼" => "\xBC",
"½" => "\xBD",
"¾" => "\xBE",
"Ã,," => "\xC4",
"Ö" => "\xD6",
"×" => "\xD7",
"Ø" => "\xD8",
"Ü" => "\xDC",
"ß" => "\xDF",
"ä" => "\xE4",
"ö" => "\xF6",
"÷" => "\xF7",
"ø" => "\xF8",
"ü" => "\xFC",
);

sub I2C_OLED_Initialize($) {
my ($hash) = @_;

$hash->{DefFn}         = "I2C_OLED_Define";
$hash->{UndefFn}       = "I2C_OLED_Undef";
$hash->{SetFn}         = "I2C_OLED_Set";
$hash->{AttrFn}        = "I2C_OLED_Attr";
 
  $hash->{AttrList}  =
  "OLED_Lines " .
  "OLED_Font:SansExtended,MonoExtended,SerifExtended " .
  "OLED_FontSize:11,13,15,17,21,23,30,38 " .
  "OLED_DiagramLastValueFirst:true,false " .
  "OLED_DiagramMaxValues " .
  "OLED_DiagramOnOff:on,off " .
  "OLED_DiagramStyle:Bars,BarsFilled,Lines,Peaks " .
  "OLED_DiagramTitle ".
  "OLED_DiagramTitleSuffix ".
  "OLED_SwitchDisplay:true,false " .
  "OLED_SwitchDisplayInterval " .
  "OLED_text_line1_prefix " .
  "OLED_text_line2_prefix " .
  "OLED_text_line3_prefix " .
  "OLED_text_line4_prefix " .
  "OLED_text_line5_prefix " .
  "OLED_text_line6_prefix " .
  "OLED_text_line1_suffix " .
  "OLED_text_line2_suffix " .
  "OLED_text_line3_suffix " .
  "OLED_text_line4_suffix " .
  "OLED_text_line5_suffix " .
  "OLED_text_line6_suffix ";
}

sub I2C_OLED_Define($$) {
    my ($hash, $def) = @_;
    my @args = split("[ \t][ \t]*", $def);
   
    #prüfen, ob Define mit ausreichend Argumenten angegeben wurde
    if(int(@args) < 5) {
        return "too few parameters: define <name> I2C_OLED <size-x> <size-y> [<address>]";
    }
   
    # Status auf "defined" setzen
    $hash->{STATE} = "defined";


    # Argumente
    my $sizex = $args[2];
    my $sizey = $args[3];
    my $address = $args[4];
   
    # Prüfen, ob Werte der Argumente ok sind
    if ($sizex != 128) {
    return "size-x must be 128";
    }
    if ($sizey != 32 and $sizey != 64) {
    return "size-y must be 32 or 64";
    }

    my $present = $dev->check_address($address);
    if ($present != 1) {return "kein Device an der angegebenen Adresse";}

# Neue Display-Instanz starten
       
        my $oled = HiPi::Interface::MonoOLED
                  -> new("type => SSD1306_.$sizex._X_.$sizey._I2C,
                     address => $address,
                     skip_reset => 1");


Standarduser

Meine Variante war exakt die selbe, funktioniert hat es trotzdem nicht.

Ich schau mir das morgen nochmal an.

anschristian

Anke für die rasche Antwort, konnte mir inzwischen bezüglich mehrerer displays selbst schon eine Antwort geben.
Habs einfach mit zwei Displays ausprobiert die haben die gleiche Adresse und funktionieren für meine zwecke mit einer Definition einwandfrei.
denn ich möchte ja auch das auf allen displays das gleiche steht und wenn man keine unterschiedlichen Texte am Display ausgeben möchte kann man das 2. 3. usw. einfach dazuhängen. Übrigens der Define Check wie von d-man angegeben hat auch bei mir nicht funktioniert. Aber trotzdem Danke für eure Hilfe.

dman

ah, ich sehe, was das Problem ist. es geht um die Adresse im hexadezimalen oder dezimalen Format. wenn man 60 dezimal statt 0x3c hexadezimal eingibt, dann funktioniert es (auch sonst). irgendwie bin ich automatisch dezimal unterwegs gewesen, weil ich Probleme mit der Umwandlung hatte... Vielleicht bekommt das ja jemand in den Griff

Peter21

Hallo, bin gerade dabei ein SH1106 Display mit FHEM anzusteuern. Ich habe versucht dementsprechend den Zugriff von SSD1306 auf SH1106 zu ändern. Leider ohne Erfolg. Mit diesem Modul werden maximal Bruchteile des Textes am oberen und unteren Rand angezeigt sobald ich Zeile 6 befülle. Bei Befüllung der Zeilen 1-5 erscheint nichts auf dem Display. Wenn ich mit PERL direkt auf das Display schreibe erscheint alles wie geplant an Ort und Stelle (Hello World).
Da ich blutiger Anfänger bin (aber lernfähig) bräuchte ich noch einen Tip welchen Parameter ich in 52_I2C_OLED ändern könnte, damit es funktioniert.
Danke, Peter.

Standarduser

Kannst du dein Display mit der HiPi-Bibliothek ansteuern? Dann Zeig doch mal deinen Code.

Peter21

Hallo,
Der Text auf dem Display funktioniert mit diesem Code:
#! /usr/bin/perl
# Bibliotheken importieren
use HiPi qw( :oled :rpi);
use HiPi::Interface::MonoOLED;
# Display einrichten
my $oled = HiPi::Interface::MonoOLED -> new(
type => SH1106_128_X_64_I2C,
address => 0x3C,
);
# Display zum Start löschen
$oled -> clear_buffer;
$oled -> display_reset();
# Hallo Welt
$oled -> draw_text(20, 16, "Hallo");
$oled -> draw_text(60, 40, "Welt!");
# Ausgaben auf Display schreiben
$oled -> display_update();

Er nutzt also auch die installierte HiPi Bibliothek. Was mich stutzig macht ist, dass der Text stehen bleibt obwohl über FHEM der Text Test geschrieben wird. Es scheint also auch kein komplettes Reset des Displays von FHEM zu geben.

Standarduser

Und hast du denn mal in der HiPi-Doku geschaut, ob SH1106-Displays auch genauso angesteuert werden?
Sonst weiß ich auch nicht.

Peter21

Hier die Originalaussage von der hipi.znix.com Homepage:

SSD1306 and SH1106 based OLED displays

Ich werde es weiter versuchen, wenn ich eine Lösung gefunden habe werde ich es schreiben, kann aufgrund Anfängerstatus etwas länger dauern :-[. Falls jemand früher die Lösung hat würde ich mich über eine Nachricht freuen.

Standarduser

Ok, welche Änderungen hast du denn am Modul vorgenommen? Da muss ja der Displaytyp eingetragen werden. Der ist im Moment jedoch fest im Modul hinterlegt und nur veränderbar, indem er dort umgestellt wird.

Bearbeite doch mal die Datei und ändere dort den Typ. Anschließend das Modul neu laden oder FHEM neustarten. Wenn das schon reicht, dann mach ich das auswählbar.

Peter21

Ich habe folgende Änderung schon vorgenommen:

   # Neue Display-Instanz starten
   my $oled = HiPi::Interface::MonoOLED -> new(
      "type => SH1106_.$sizex._X_.$sizey._I2C,
      address => $address,
      skip_reset => 1"
   );

   # Werte in Internals sichern

Ich bin der Meinung das hätte reichen sollen,da der Rest ja identisch sein sollte. Meine Vorstellung ist, nur auf den passenden "Treiber" SH1106 umleiten und da die Größe / Pixel / Zeilen identisch sind sollte es funktionieren.

Standarduser

Ich hätte jetzt auch erwartet, dass das die einzig nötige Änderung ist. Wenn das nicht reicht, dann weiß ich im Moment auch erstmal nicht weiter, denn so ein Display besitze ich nicht. Ich könnte also nichtmal irgendwas testen.

Peter21

Ich habe es geschafft das SH1106 zum laufen zu bekommen. Ich habe in der oled_I2C.pm den Start des Display geändert:

    if ($sizey != 32 and $sizey != 64) {
       return "size-y must be 32 or 64";
    }

   # Neue Display-Instanz starten

# Bibliotheken importieren
use HiPi qw( :oled :rpi);
use HiPi::Interface::MonoOLED;
# Display einrichten
my $oled = HiPi::Interface::MonoOLED -> new(
type => SH1106_128_X_64_I2C,
address => 0x3C,
);
# Display zum Start löschen
$oled -> clear_buffer;
$oled -> display_reset();



   # Werte in Internals sichern
   $hash->{oled}       = $oled;
    $hash->{size_x}      = $sizex;


Da Adresse und Maße / Pixel fest sind habe diese einfach mit rein genommen.
Ich hätte da nur noch eine Frage. Ich versuche nun auf dem Display die Temperatur des Raspi anzuzeigen. Meine Idee war, mit einen notify die Readings in die text_line1 zu senden. Leider ohne Erfolg:

Raspi_System:cpu_temp.* { fhem("set oled:text_line1 ". $EVENT) }

Habe ich einen Fehler in dem Notify (mache ich es mir zu einfach), oder war ein anderer Weg zur automatischen Anzeige geplant??

Peter21

OK hat sich erledigt bin soeben über die noch einfachere Lösung gestolpert:

set text_line1 [Raspi_System:cpu_temp]


Danke und schönes Wochenende.

Peter21

Hallo, leider musste ich feststellen,daß diese Variante einmalig zum Erfolg führt und dann der ausgelesene Wert fest im Display steht. Geht man nach einer Aktualisierung wieder auf text_line steht dort der Wert und nicht mehr die Abfrage des Readings.
Hat jemand doch noch einen Vorschlag wie man eigenständig aktualisierte Werte bekommt?????
Danke.

Standarduser

Ich mache das mit einem Notify, hier im Beispiel die Temperatur von Proplanta:

define oled_temp notify Wetter.Proplanta:temperature:.* set oled text_line1 [Wetter.Proplanta:temperature]

Sobald sich der Wert ändert, wird dieser ins Display geschrieben/aktualisiert. Da du damit nur den Wert selbst, ohne Beschriftung übernehmen kannst, gibt es das Attribut OLED_text_line1_prefix. Damit kannst du den statischen Text Raspi_System: davorschreiben. Für das °C hinter dem Wert gibt es das Attribut OLED_text_line1_suffix.

Standarduser

Zitat von: Peter21 am 26 Mai 2019, 09:02:49
Ich habe es geschafft das SH1106 zum laufen zu bekommen. Ich habe in der oled_I2C.pm den Start des Display geändert:

    if ($sizey != 32 and $sizey != 64) {
       return "size-y must be 32 or 64";
    }

   # Neue Display-Instanz starten

# Bibliotheken importieren
use HiPi qw( :oled :rpi);
use HiPi::Interface::MonoOLED;
# Display einrichten
my $oled = HiPi::Interface::MonoOLED -> new(
type => SH1106_128_X_64_I2C,
address => 0x3C,
);
# Display zum Start löschen
$oled -> clear_buffer;
$oled -> display_reset();



   # Werte in Internals sichern
   $hash->{oled}       = $oled;
    $hash->{size_x}      = $sizex;


Da Adresse und Maße / Pixel fest sind habe diese einfach mit rein genommen.

Ich hab gerade nochmal versucht, das nachzuvollziehen. Am Ende hast du doch einfach nur den Displaytyp geändert, oder?
Ich konnte sonst keinerlei Unterschiede erkennen, außer, dass du die Werte fest eingetragen hast. Oder täusche ich mich?
Wie sieht deine 52_I2C_OLED.pm jetzt aus? Kannst du die vielleicht mal vollständig anhängen?

Peter21

Besten Dank für die Hinweise, konnte ich am Wochenende erfolgreich umsetzen ;D ;D ;D. Ich habe noch den Impuls des Bewegungsmelder genutzt um die Datenlast zu reduzieren. Wenn man sich jetzt dem Display nährt, schaltet sich das Display (Licht) an und die Daten werden aktuell vom notify übertragen.
Ich hänge mal meine funktionierende Variante dran. Bei dieser habe ich aber die Ergänzung von Seite 1 nicht mit einbringen können. Ich bekomme anscheinend durch die feste Adresse beim Start gleich eine Fehlermeldung. Also falls das Display defekt oder abhanden kommt,einloggen mit putty und die 52_I2C_OLED umbennen (reicht) und FHEM startet auch wieder. Ich kann mit diesem Bug leben.
Ich habe noch die Zeilen im Display auf 5 reduziert und die Schrift eine Nummer größer gestaltet. Die Augen werden im Alter auch nicht besser ::).

Standarduser

Zitat von: Peter21 am 03 Juni 2019, 17:46:04
Ich habe noch die Zeilen im Display auf 5 reduziert und die Schrift eine Nummer größer gestaltet. Die Augen werden im Alter auch nicht besser ::).

Das kannst du auch über die Attribute einstellen, ich dachte mir nämlich schon, dass die Schrift dem einen oder anderen zu klein sein wird.

Peter21

Habe ich auch so gemacht, über Atribute eingestellt.

Besten Dank nochmal für das nützliche Modul!!!!!


Standarduser

#28
Zitat von: Peter21 am 03 Juni 2019, 17:46:04
Besten Dank für die Hinweise, konnte ich am Wochenende erfolgreich umsetzen ;D ;D ;D. Ich habe noch den Impuls des Bewegungsmelder genutzt um die Datenlast zu reduzieren. Wenn man sich jetzt dem Display nährt, schaltet sich das Display (Licht) an und die Daten werden aktuell vom notify übertragen.
Ich hänge mal meine funktionierende Variante dran. Bei dieser habe ich aber die Ergänzung von Seite 1 nicht mit einbringen können. Ich bekomme anscheinend durch die feste Adresse beim Start gleich eine Fehlermeldung. Also falls das Display defekt oder abhanden kommt,einloggen mit putty und die 52_I2C_OLED umbennen (reicht) und FHEM startet auch wieder. Ich kann mit diesem Bug leben.
Ich habe noch die Zeilen im Display auf 5 reduziert und die Schrift eine Nummer größer gestaltet. Die Augen werden im Alter auch nicht besser ::).

Hi Peter,

ich hab mal eine überarbeitete Version angehängt. Hast du Lust, die mal auszuprobieren?

Peter21

Sorry für die extrem späte Antwort. Habe mir die Datei gedownloadet und werde sie in den Oktoberferien mal testen. Melde mich wie es ausgegangen ist. Bis Dato läuft meine Variante stabil, da ich auch noch nichts verändert habe, never touch a running system :-).

RomanesEuntDomus


RomanesEuntDomus

In Zeile 126 ist der Vergleich nicht korrekt

- if ($type != "SSD1306" and $type != "SH1106") {
+if ($type ne "SSD1306" and $type ne "SH1106") {

Standarduser

Danke für das Feedback. Ich hab eine korrigierte Version im ersten Post angehängt.

My-FHEM

Hallo ich versuche das Modul einzubinden,

aber beim Start crashed FHEM im Log erscheint:

Undefined subroutine &HiPi::Device::I2C::_i2c_write called at /usr/lib/perl5/site_perl/5.28.1/aarch64-linux-thread-multi/HiPi/Device/I2C.pm line 319


I2C ist definiert und funktioniert mit anderen I2C Modulen

Internals:
   DEF        0
   DeviceName /dev/i2c-0
   FUUID      5dab3735-f33f-6f28-9ce7-ca6fc79408d182df
   NAME       myi2c_0
   NOTIFYDEV  global
   NR         14
   NTFY_ORDER 50-myi2c_0
   STATE      Ok
   TYPE       RPII2C
   ioctl_ph_exists 1
Attributes:
   room       io



Gibt es eine Idee was los ist?
Danke.

Standarduser

Ließ nochmal die Voraussetzungen im ersten Post. Hast du die RPII2C-Instanz laufen?

My-FHEM

Ist nicht:


TYPE       RPII2C


das Modul RPII2C?

Das läuft und wird von meinen anderen i2c komponenten benutzt. Wie im obigen Post zu sehen.

Das Oled Modul ist v. 0.3.1
Das HiPi::Interface::MonoOLED is up to date. (0.80).

Gruß


Standarduser

Sorry, das hatte ich überlesen.
Ich bin da jetzt leider auch nicht so der Profi. Ich hab mir das Modul nur zusammengeflickt und bei mir funktioniert es. Weitere I2C-Geräte hab ich nicht angeschlossen