Ankündigung

Einklappen
Keine Ankündigung bisher.

Edomi im Docker-Container - RockyLinux (x86_64 & aarch64)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Hallo Glotzkowski,
    ich bin nicht sicher, ob ich genau verstehe, was Du meinst.
    Der MQTT Broker läuft als separater Container auf dem TWS im Macvlan Modus - also mit eigener IP, ebenso wie der Edomi Container. Das funktioniert prinzipiell auch problemlos. Andere Geräte (Tasmota) und auch das auf CentOS in einer VM laufende Edomi kommuniziert mit dem MQTT Broker.
    Oder meinst Du etwas anderes?

    Ich versuche aber weiterhin, die Fehlerursache zu finden indem ich die Installationen vom TWS Edomi mit der vom CentOS Edomi vergleiche.
    Dabei habe ich ein unterschiedliches Verhalten im MySQL festgestellt.

    Auf dem CentOS Edomi kann ich die vom LBS erzeugte Stored Procedure (mqtt_publish) manuell aufrufen
    Code:
    call edomiLive.mqtt_publish(1, '1/2/3', 'test', '123');
    und erhalte als Ergebnis eine "Erfolgsmeldung" im MySQL
    3 2 07:48:24 call edomiLive.mqtt_publish(1, '1/2/3', 'test', '123') 0 row(s) affected 0.015 sec
    In dem MySQL auf dem TWS Edomi bekomme ich eine Fehlermeldung
    0 2 07:38:16 call edomiLive.mqtt_publish(1, '1/2/3', 'test', '123') Error Code: 1305. FUNCTION edomiLive.sys_exec does not exist 0.000 sec

    Also fehlt dem TWS Edomi offensichtlich ein Teil der notwendigen MySQL Anpassung

    Komischerweise kann ich in beidem MySQL Installationen unter 'Functions' nicht finden...

    Ich suche weiter. Falls jemand noch eine Idee hat - ich wäre für jeden Hinweis dankbar.

    Vielen Dank und viele Grüße

    Piet

    Kommentar


      Hallo piet61,

      ich habe Version 2.03.9 des Images auf Dockerhub hochgeladen. Dort ist nun das php-mosquitto-Paket installiert. Bitte versuche es mal damit und lass' mich wissen, was das Resultat ist!

      Wenn das immer noch nicht geht hätte ich gern eine Beschreibung, wie ich es nachstellen kannst resp. wie genau Du die obigen Versuche gemacht hast.
      Kind regards,
      Yves

      Kommentar


        Hallo Yves starwarsfan,
        vielen Dank für die Bereitstellung eines neuen Edomi Images - leider funktioniert der "MQTT Publish Server LBS" (19001051) immer noch nicht

        Was habe ich genau gemacht:
        Nachdem ich gesehen hatte, dass Du eine neue Version des Edomi Images hochgeladen hattest, habe ich den auf der Version 2.03.8 basierten Container komplett incl. der separaten Edomi Volumes vom TWS gelöscht und den TWS vorsichtshalber neu gestartet.
        Mein TWS läuft mit MacVLAN - jeder Container hat also seine eigen IP in meinem Netzwerk.
        Auf dem TWS läuft auch der MQTT Broker als Container mit einer eigenen IP.

        Der MQTT Broker funktioniert soweit - ich habe einige Tasmota Devices im Netz, die über MQTT Daten an den TWS senden bzw. von dort empfangen. Auch mein 'altes' Edomi, was auf einer X86 CPU in einer VM unter CentOS 7 läuft, sendet mit Hilfe des "MQTT Publish Server LBS" Daten an den MQTT Broker.

        Dann habe ich den Edomi Container mit dem 2.03.9 Image neu eingerichtet - die separaten Volumens angelegt, die Variablen zugeordnet und die Netzwerkverbindung eingerichtet.

        Auf dem TWS laufen also 2 Container
        image.png
        Die Konfiguration des Edomi Containers sieht so aus:
        image.png
        Der Zugriff aus meinem Netz auf das Edomi Admin Interface (http://10.0.2.97/admin) als auch der SSH Zugriff auf den Edomi Container funktionieren einwandfrei.

        Dann habe ich die Edomi Basiskonfiguration (Edomi.ini) angepasst (den TWS als IP Interface für Edomi eingerichtet) und mein KNX Projekt ins Edomi geladen.
        Edomi läuft generell einwandfrei und "sieht" auch den KNX Traffic.

        Anschließend habe ich den "MQTT Publish Server" LBS (19001051) ins Edomi geladen, eine Logikseite angelegt und die entsprechenden Konfigurationsdaten in dem LBS eingegeben. Außerdem habe ich noch eine einzelne KNX GA, die sehr häufig redet, mit dem String "MPUB" versehen, um den Inhalt dieser GA an den MQTT Broker zu senden.
        image.pngimage.png

        Wenn ich Edomi dann neu starte, werden folgende Einträge im Individual Log erzeugt​​:

        Code:
        ​​024-04-14 13:15:02    607471    27311    debug-mysql    LBS19001051 [v1.4]: QUERY: CREATE PROCEDURE mqtt_publish(typ INT(10), ga VARCHAR(1000), name VARCHAR(1000), value VARCHAR(11000)) BEGIN DECLARE cmd VARCHAR(1000); DECLARE result INT(10); DECLARE logresult INT(10); SET cmd = CONCAT('/usr/bin/bash -c "/usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19001051.php ',typ,' ',ga,' \'',name,'\' \'',value,'\' & "'); SET logresult = log_error(cmd); SET result = sys_exec(cmd); END (1)
        2024-04-14 13:15:02    634753    27311    debug-mysql    LBS19001051 [v1.4]: Query: SELECT ga,name FROM edomiLive.ko WHERE text LIKE "%MPUB%" (1)
        2024-04-14 13:15:02    644015    27311    debug-mysql    LBS19001051 [v1.4]: Query-Result: (1)
        2024-04-14 13:15:02    644490    27311    debug-mysql    LBS19001051 [v1.4]: ================ ARRAY/OBJECT START ================
        2024-04-14 13:15:02    644711    27311    debug-mysql    LBS19001051 [v1.4]: [{"ga":"30\/3\/29","name":"Enertex Netzteil - Aktuelle Telegrammrate (pro Sekunde)"}]
        2024-04-14 13:15:02    644911    27311    debug-mysql    LBS19001051 [v1.4]: ================ ARRAY/OBJECT END ================​
        Der LBS filtert also die GA mit dem String "MPUB" aus allen GAs heraus und es wird in der edomiLive Datenbank eine "Stored Procedure" in der MySQL (MariaDB) Datenbank erzeugt.
        Dies funktioniert soweit auch, die Stored Procedure ist vorhanden.

        image.png
        Diese Stored Procedure enthält folgenden Code:
        Code:
        CREATE DEFINER=`root`@`localhost` PROCEDURE `mqtt_publish`(typ INT(10), ga VARCHAR(1000), name VARCHAR(1000), value VARCHAR(11000))
        BEGIN DECLARE cmd VARCHAR(1000); DECLARE result INT(10); DECLARE logresult INT(10); SET cmd = CONCAT('/usr/bin/bash -c "/usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19001051.php ',typ,' ',ga,' \'',name,'\' \'',value,'\' & "'); SET logresult = log_error(cmd); SET result = sys_exec(cmd); END​
        Wenn man nun aber versucht, diese Stored Procedure manuell innerhalb des MySQL (MariaDB) Servers auszuführen, erhält man die Fehlermeldung:
        Code:
        MariaDB [(none)]> call edomiLive.mqtt_publish(1, '30\/3\/29', 'Enertex Netzteil - Aktuelle Telegrammrate (pro Sekunde)', '23');
        ERROR 1305 (42000): FUNCTION edomiLive.sys_exec does not exist
        ​
        Ich habe verschiedene Schreibweisen für die Parameterübergabe ausprobiert - leider alle ohne Erfolg.

        Die Funktion 'sys_exec' ist eine Funktion innerhalt des SQL Servers, um Shell Kommandos aus dem SQL Server heraus ausführen zu können. Diese Funktion wird offensichtlich nicht standardmäßig mit installiert, sondern muss, soweit ich das verstehe, für die jeweilige Plattform kompiliert werden (https://github.com/mysqludf/lib_mysqludf_sys#readme)
        In der MariaDB Installation auf CentOS ist dies Funktion aber wohl standardmäßig dabei, denn dort funktioniert der LBS ohne dass ich etwas zusätzlich installiert habe.
        Das Kompilieren dieses AddOns geht allerdings weit über meine Kenntnisse und Fähigkeiten hinaus.

        Ich weiß nicht, ob Du hier weiterhelfen kannst - aber auf jeden Fall ein großes Dankeschön für Deine tolle Unterstützung!

        Viele Grüße

        Piet

        Nachtrag:
        Ich kann auf der Kommandozeile vom Edomi manuell folgendes Kommando ausführen:
        Code:
        /usr/bin/php /usr/local/edomi/www/data/liveproject/lbs/EXE19001051.php '1' "30/3/29" "Enertex Netzteil - Aktuelle Telegrammrate (pro Sekunde)" '23'
        Ich erhalte dann eine entsprechende Nachricht im MQTT Broker
        image.png
        Das Problem besteht also sehr wahrscheinlich darin, dass das Kommando nicht per "sys_exec" aus der Datenbank heraus ausgeführt werden kann.

        Nachtrag 2:
        Auf dem 'TWS Edomi' ergibt eine Abfrage der vorhandenen Funktionen in der Datenbank folgendes:

        Code:
        MariaDB [(none)]> SELECT * FROM mysql.func;
        +-----------------------+-----+---------------------+----------+
        | name                  | ret | dl                  | type     |
        +-----------------------+-----+---------------------+----------+
        | lib_mysqludf_log_info |   0 | lib_mysqludf_log.so | function |
        | log_error             |   0 | lib_mysqludf_log.so | function |
        +-----------------------+-----+---------------------+----------+
        2 rows in set (0.002 sec)
        ​
        Die gleiche Abfrage auf dem CentOS Edomi​ ergibt:

        Code:
        MariaDB [(none)]> SELECT * FROM mysql.func;
        +-----------------------+-----+---------------------+----------+
        | name                  | ret | dl                  | type     |
        +-----------------------+-----+---------------------+----------+
        | lib_mysqludf_sys_info |   0 | lib_mysqludf_sys.so | function |
        | sys_get               |   0 | lib_mysqludf_sys.so | function |
        | sys_set               |   2 | lib_mysqludf_sys.so | function |
        | sys_exec              |   2 | lib_mysqludf_sys.so | function |
        | sys_eval              |   0 | lib_mysqludf_sys.so | function |
        | lib_mysqludf_log_info |   0 | lib_mysqludf_log.so | function |
        | log_error             |   0 | lib_mysqludf_log.so | function |
        +-----------------------+-----+---------------------+----------+
        7 rows in set (0.00 sec)
        ​
        Angehängte Dateien
        Zuletzt geändert von piet61; 14.04.2024, 16:49.

        Kommentar


          Hallo Zusammen,
          die Lösung ist gefunden

          Man muss gar nichts selbst compilieren, da die notwendige Library bereits vorhanden ist. Zu finden ist sie hier:
          Code:
          root@tws-edomi:~# ll /usr/lib64/mariadb/plugin/lib_mysqludf_sys*
          -rwxr-xr-x 1 root root 71488 Apr 10 22:29 /usr/lib64/mariadb/plugin/lib_mysqludf_sys.so*
          ​
          Man muss nun nur noch die 'sys_exec' funktion in der Datenbak anlegen.
          Code:
          MariaDB [(none)]> CREATE FUNCTION sys_exec RETURNS INT SONAME 'lib_mysqludf_sys.so';
          Query OK, 0 rows affected (0.001 sec)
          ​
          Ich habe direkt die anderen Funktionen, die auf meinen CentOS Edomi vorhanden sind, ebenfalls eingerichtet.

          Nach einem Neustart von Edomi werden die Daten wie gewünscht per MQTT an den MQTT Broker weitergeleitet

          starwarsfan
          vielleicht könntest Du diese Funktion in einer nächsten Version vom Edomi Docker Image mit einrichten?
          Nochmals vielen Dank!

          Viele Grüße

          Piet

          Kommentar


            Hallo piet61

            Zitat von piet61 Beitrag anzeigen
            die Lösung ist gefunden

            Coole Sache!


            Zitat von piet61 Beitrag anzeigen

            Man muss gar nichts selbst compilieren, da die notwendige Library bereits vorhanden ist.

            Ja das ist klar da das beim Image-Build gemacht wird. Sprich, das Kompilieren der Library und deren Installation wird beim Build des Baseimages gemacht.


            Zitat von piet61 Beitrag anzeigen

            Man muss nun nur noch die 'sys_exec' funktion in der Datenbak anlegen.
            Das sollte eigentlich auch gemacht werden aber offensichtlich hat sich hier ein Problem eingeschlichen. Ich kam noch nicht dazu, mir das im Detail anzuschauen und nächste Woche bin ich in den Ferien. Kann also noch eine Weile dauern...​


            Zitat von piet61 Beitrag anzeigen

            Ich habe direkt die anderen Funktionen, die auf meinen CentOS Edomi vorhanden sind, ebenfalls eingerichtet.

            Und welche wären das? Ich nehme an, von anderen LBS, welche nicht in #1 aufgeführt sind?

            Zitat von piet61 Beitrag anzeigen

            starwarsfan
            vielleicht könntest Du diese Funktion in einer nächsten Version vom Edomi Docker Image mit einrichten?
            Wie gesagt, das sollte eigentlich schon so sein, ist es aber offenbar momentan nicht...
            Kind regards,
            Yves

            Kommentar


              Hallo starwarsfan,
              Zitat von starwarsfan Beitrag anzeigen
              Und welche wären das?
              Ich meine diese hier:
              Code:
              MariaDB [(none)]> SELECT * FROM mysql.func;
              +-----------------------+-----+---------------------+----------+
              | name                  | ret | dl                  | type     |
              +-----------------------+-----+---------------------+----------+
              | lib_mysqludf_sys_info |   0 | lib_mysqludf_sys.so | function |
              | sys_get               |   0 | lib_mysqludf_sys.so | function |
              | sys_set               |   2 | lib_mysqludf_sys.so | function |
              | sys_exec              |   2 | lib_mysqludf_sys.so | function |
              | sys_eval              |   0 | lib_mysqludf_sys.so | function |
              | lib_mysqludf_log_info |   0 | lib_mysqludf_log.so | function |
              | log_error             |   0 | lib_mysqludf_log.so | function |
              +-----------------------+-----+---------------------+----------+
              7 rows in set (0.00 sec)
              ​
              Die passenden Kommandos für die Einrichtung dieser Funktionen habe ich hier gefunden: https://owllab.org/online/mariadb-sys_exec-trigger-call-shell-command-hint/

              Sie lauten:

              Code:
              CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
              CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
              CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
              CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
              CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';
              ​
              Viele Grüße und schöne Ferien!

              Piet

              Kommentar


                Das sollte eigentlich alles automatisch passieren, wenn man der Installationsanleitung des LBS folgt:

                Code:
                git clone https://github.com/jonofe/lib_mysqludf_sys
                cd lib_mysqludf_sys/
                ./install.sh
                Die install.sh macht

                Code:
                mysql -u root mysql < lib_mysqludf_sys.sql
                und lib_mysqludf_sys.sql enthält

                Code:
                DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
                DROP FUNCTION IF EXISTS sys_get;
                DROP FUNCTION IF EXISTS sys_set;
                DROP FUNCTION IF EXISTS sys_exec;
                DROP FUNCTION IF EXISTS sys_eval;
                
                CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so';
                CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so';
                CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so';
                CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so';
                CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so';​

                Kommentar


                  Hallo André

                  Zitat von jonofe Beitrag anzeigen
                  Das sollte eigentlich alles automatisch passieren, wenn man der Installationsanleitung des LBS folgt:
                  Jain, wir reden hier vom Docker-Image, da passiert das alles beim Build es Images.​


                  Zitat von jonofe Beitrag anzeigen
                  Code:
                  git clone https://github.com/jonofe/lib_mysqludf_sys
                  cd lib_mysqludf_sys/
                  ./install.sh
                  Gebaut und ins Edomi-Baseimage wird das hier kopiert.


                  Zitat von jonofe Beitrag anzeigen
                  ​Die install.sh macht

                  Code:
                  mysql -u root mysql < lib_mysqludf_sys.sql
                  Das passiert dann bei der Installation von Edomi und zwar hier.​


                  Zitat von jonofe Beitrag anzeigen
                  ​und lib_mysqludf_sys.sql enthält
                  ...
                  Das muss ich mir nun im Detail ansehen, ob/was da schief geht. Mglw. tritt der Fehler auch nur bei der aarch64-Variante auf, bekanntlich ist ja nichts unmöglich...
                  Kind regards,
                  Yves

                  Kommentar


                    Zitat von starwarsfan Beitrag anzeigen
                    Jain, wir reden hier vom Docker-Image, da passiert das alles beim Build es Images.​
                    Hi Yves,
                    Ja das ist schon klar. Im Docker Build sollte das ja genauso funktionieren.
                    Meine Vermutung ist, dass es nicht für aarch64 kompiliert.
                    Die Library ist 12 Jahre alt.
                    VG, André

                    Kommentar


                      Hallo André

                      Zitat von jonofe Beitrag anzeigen
                      Meine Vermutung ist, dass es nicht für aarch64 kompiliert.
                      Die Library ist 12 Jahre alt.
                      Die Scripts etc. sind aber vorhanden, nur deren Installation scheint nicht geklappt zu haben. Piet hat's ja dann händisch gemacht und es funktioniert. Wenn da etwas beim kompilieren schief gegangen wäre, dann sollten die Scripts ja gar nicht erst vorhanden sein, oder?
                      Kind regards,
                      Yves

                      Kommentar


                        Hallo jonofe, hallo piet61,

                        ich habe das Problem gefunden. Das kann in meinem Image resp. Template noch nie funktioniert haben denn es wird schlichtweg nur lib_mysqludf_log, nicht aber lib_mysqludf_sys installiert.

                        Offenbar hat das bisher noch nie jemand in dieser Konstellation verwendet, sonst wäre das schon viel früher aufgefallen.
                        Kind regards,
                        Yves

                        Kommentar


                          Hallo piet61,

                          die Version 2.03.10 des Dockerimage liegt auf Dockerhub. Wenn Du magst, damit gerne nochmal prüfen, ob der LBS jetzt korrekt funktioniert.
                          Kind regards,
                          Yves

                          Kommentar


                            Hallo Yves starwarsfan
                            Habe gerade getestet und es funktioniert mit der 2.3.10 wunderbar. Ich habe einfach den Minutentrigger aus Edomi per MQTT übertragen und er kommt direkt beim MQTT Broker an.
                            Zitat von starwarsfan Beitrag anzeigen
                            Offenbar hat das bisher noch nie jemand in dieser Konstellation verwendet
                            Das wundert mich auch etwas. Ich meine schon mehrfach gelesen zu haben, dass TWS User Daten per MQTT von Edomi an den TWS senden - aber vielleicht nutzen die Edomi ja nicht in einem Container oder sie nehmen einen andren LBS

                            Aber egal - ich möchte mich nochmal herzlich für Deine super Unterstützung bedanken! Echt klasse!

                            Viele Grüße

                            Piet

                            Kommentar


                              Hallo miteinander,

                              ich oute mich als jemand, der sich wenig mit Containern etc auskennt. Ich habe es aber mittlerweile trotzdem geschafft, Edomi als Container auf meiner Synology zum Laufen zu bringen. Zugriff auf die Admin Seite, Logiken etc funktioniert alles. Was noch nicht funktioniert ist der Zugriff auf die Visu. Hier komme ich zwar auf die Visu Login Seite und kann eine Visu auswählen und meinen Login eintragen, dann bleibt Edomi aber beim Logo mit dem roten Kreis stehen.
                              Ich nutze Portainer, um den Container zu verwalten.

                              Zitat von starwarsfan Beitrag anzeigen
                              Hallo miteinander



                              Genau so ist das. Der interne Port ist 88 und muss auch so bleiben. Der externe Port, also der Port, über den auf den Container zugegriffen wird, muss via HTTPPORT-Env-Var mitgegeben werden, sofern es nicht der Default-HTTP-Port 80 ist.
                              Ich vermute, dass hier mein Problem liegt, denn der HTTPPORT taucht in den Env-Variablen nicht auf. Wenn ich diese Variable hinzufüge und den Container neu erstelle, taucht die Variable aber weiterhin nicht auf. Gibt es da eventuell eine andere Benennung dieser Variable bei der Syno oder habe ich ein anderes Problem?
                              So trage ich das in Portainer ein:
                              Screenshot 2024-04-29 174031.png

                              Vielleicht hat ja einer eine leichte Lösung für mich, ich habe außer diesem HTTPPORT keinen Hinweis gefunden, woran es sonst bei mir liegen kann.

                              VG Finn

                              Kommentar


                                Hallo Finn,

                                hab's gerade eben auf meiner Synology problemlos durchgespielt und es funktioniert. Allerdings mit dem hauseigenen Container-Manager, da ich keinen Portainer auf der Syno habe.

                                Dein Screenshot nützt herzlich wenig. Bitte alle Settings zeigen!
                                Kind regards,
                                Yves

                                Kommentar

                                Lädt...
                                X