Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. EZOGateway; Watermonitoring

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    17
    1
    562

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    5.5k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.4k

EZOGateway; Watermonitoring

Scheduled Pinned Locked Moved Hardware
ezo gateway pool monitoring
47 Posts 7 Posters 7.1k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J JohnnyBahama

    @100prznt Die Idee mit den GPIO gefällt mir natürlich am besten, der ESP oder WEMO bedeutet ein weiteres WLAN Gerät+Netzteil. Ethernet ist an der Stelle nicht vorhanden und einen Extender würde ich gerne vermeiden. Kompliziert lassen wir direkt weg.
    Da du EZO programmiert hast, bin ich auf dich angewiesen. https://www.robotshop.com/de/de/4-kanal-relais-hat-raspberry-pi-3b-3b-2b.html an die Karte habe ich gedacht.

    100prznt1 Offline
    100prznt1 Offline
    100prznt
    wrote on last edited by
    #34

    @johnnybahama Wenn du auf ein HAT mit paralleler Ansteuerung setzt, z.B. https://www.robotshop.com/de/de/3-kanal-raspberry-relaisplatine.html könnte ich die Software entsprechend anpassen. Die Integration der von dir vorgeschlagenen HAT mit I2C Schnittstelle geht nicht ohne Hardwaretest.

    J 1 Reply Last reply
    0
    • 100prznt1 100prznt

      @johnnybahama Wenn du auf ein HAT mit paralleler Ansteuerung setzt, z.B. https://www.robotshop.com/de/de/3-kanal-raspberry-relaisplatine.html könnte ich die Software entsprechend anpassen. Die Integration der von dir vorgeschlagenen HAT mit I2C Schnittstelle geht nicht ohne Hardwaretest.

      J Offline
      J Offline
      JohnnyBahama
      wrote on last edited by
      #35

      @100prznt 3 Relais würden es ziemlich limitieren. Ich habe die Salzanlage, Solarbasorberventil, LED und in Zukunft 2 für die Impfpumpen. Ginge es auch mit der hier: https://de.aliexpress.com/i/32997012084.html

      100prznt1 2 Replies Last reply
      0
      • J JohnnyBahama

        @100prznt 3 Relais würden es ziemlich limitieren. Ich habe die Salzanlage, Solarbasorberventil, LED und in Zukunft 2 für die Impfpumpen. Ginge es auch mit der hier: https://de.aliexpress.com/i/32997012084.html

        100prznt1 Offline
        100prznt1 Offline
        100prznt
        wrote on last edited by
        #36

        @johnnybahama Den fotos nach werden bei der HAT die Relais auch direkt per GPIO angesteuert, geht also genau so. (Y)

        1 Reply Last reply
        0
        • J JohnnyBahama

          @100prznt 3 Relais würden es ziemlich limitieren. Ich habe die Salzanlage, Solarbasorberventil, LED und in Zukunft 2 für die Impfpumpen. Ginge es auch mit der hier: https://de.aliexpress.com/i/32997012084.html

          100prznt1 Offline
          100prznt1 Offline
          100prznt
          wrote on last edited by 100prznt
          #37

          @johnnybahama Habe die Software soweit vorbereitet, liegt vorerst in einem eigenen Branch, falls du schon testen willst.

          Im IoDispatcher wird ein readonly Array definiert, welches die GPIO Nummern der "Ausgänge" definiert.

                  //GPIO pins in sequence for channel 1 to n.
                  //Pin 2 and 3 are reserved for I2C communication with the EZO circuit modules.
                  private readonly int[] OUT_PINS = { 5, 6, 13, 19, 26, 12 };
          

          https://github.com/100prznt/EzoGateway/blob/915775ffe9e7f52b15d0b02a984684e20d16cf16/source/EzoGateway/IoDispatcher.cs#L41

          Nach einem Systemstart werden die entsprechend definierten GPIOs initialisiert und können über die REST API bedient werden.
          Dazu gibt es im HttpServer eine neue Verzweigung:

                          else if (request.Uri.Segments.Length >= 3 && request.Uri.Segments[2].Trim('/').Equals("OUTPUT", StringComparison.OrdinalIgnoreCase))
                          {
                              if (request.Uri.Segments.Length == 3 && request.Method == HttpMethod.Get)
                              {
                                  var channelDict = new Dictionary<string, IoData>();
                                  for (int i = 0; i < m_Controller.Io.OutputChannelCount; i++)
                                      channelDict.Add((i + 1).ToString(), new IoData(m_Controller.Io.GetOutput(i + 1)));
          
                                  return HttpResource.CreateJsonResource(channelDict);
                              }
                              else if (request.Uri.Segments.Length == 4)
                              {
                                  if (Int32.TryParse(request.Uri.Segments[3].Trim('/'), out int channel))
                                  {
                                      if (channel >= 1 && channel <= m_Controller.Io.OutputChannelCount)
                                      {
                                          if (request.Method == HttpMethod.Get)
                                          {
                                              var state = new Dictionary<string, string>
                                              {
                                                  { "state", m_Controller.Io.GetOutput(channel).ToString() }
                                              };
                                              return HttpResource.CreateJsonResource(state);
                                          }
                                          else if (request.Method == HttpMethod.Put)
                                          {
                                              var ioData = JsonConvert.DeserializeObject<IoData>(request.Content);
                                              m_Controller.Io.SetOutput(channel, ioData.State);
          
                                              return HttpResource.CreateJsonResource(new RestStatus(OperationStatus.Success, "Output state send to GPIO controller"));
                                          }
                                      }
                                      else
                                          return HttpResource.JsonLocked423("Invalide channel number.");
                                  }
                              }
                          }
          

          https://github.com/100prznt/EzoGateway/blob/915775ffe9e7f52b15d0b02a984684e20d16cf16/source/EzoGateway/Server/HttpServer.cs#L626

          Der Call zum setzen eines Ausgangs sieht wie folgt aus:
          URL: http://<IP EZO Gateway>/api/output/<Kanalnummer>
          Methode: PUT
          Body:

          {
              State: <true oder false>
          }
          

          Abfrage erfolgt analog per GET, ohne Kanalnummer kommt ein Array mit allen Kanälen zurück.

          Hab das jetzt erstmal nur schnell runter geschrieben, ein Test an Hardware steht noch aus.

          Beste Grüße
          Elias

          J 2 Replies Last reply
          0
          • 100prznt1 100prznt

            @johnnybahama Habe die Software soweit vorbereitet, liegt vorerst in einem eigenen Branch, falls du schon testen willst.

            Im IoDispatcher wird ein readonly Array definiert, welches die GPIO Nummern der "Ausgänge" definiert.

                    //GPIO pins in sequence for channel 1 to n.
                    //Pin 2 and 3 are reserved for I2C communication with the EZO circuit modules.
                    private readonly int[] OUT_PINS = { 5, 6, 13, 19, 26, 12 };
            

            https://github.com/100prznt/EzoGateway/blob/915775ffe9e7f52b15d0b02a984684e20d16cf16/source/EzoGateway/IoDispatcher.cs#L41

            Nach einem Systemstart werden die entsprechend definierten GPIOs initialisiert und können über die REST API bedient werden.
            Dazu gibt es im HttpServer eine neue Verzweigung:

                            else if (request.Uri.Segments.Length >= 3 && request.Uri.Segments[2].Trim('/').Equals("OUTPUT", StringComparison.OrdinalIgnoreCase))
                            {
                                if (request.Uri.Segments.Length == 3 && request.Method == HttpMethod.Get)
                                {
                                    var channelDict = new Dictionary<string, IoData>();
                                    for (int i = 0; i < m_Controller.Io.OutputChannelCount; i++)
                                        channelDict.Add((i + 1).ToString(), new IoData(m_Controller.Io.GetOutput(i + 1)));
            
                                    return HttpResource.CreateJsonResource(channelDict);
                                }
                                else if (request.Uri.Segments.Length == 4)
                                {
                                    if (Int32.TryParse(request.Uri.Segments[3].Trim('/'), out int channel))
                                    {
                                        if (channel >= 1 && channel <= m_Controller.Io.OutputChannelCount)
                                        {
                                            if (request.Method == HttpMethod.Get)
                                            {
                                                var state = new Dictionary<string, string>
                                                {
                                                    { "state", m_Controller.Io.GetOutput(channel).ToString() }
                                                };
                                                return HttpResource.CreateJsonResource(state);
                                            }
                                            else if (request.Method == HttpMethod.Put)
                                            {
                                                var ioData = JsonConvert.DeserializeObject<IoData>(request.Content);
                                                m_Controller.Io.SetOutput(channel, ioData.State);
            
                                                return HttpResource.CreateJsonResource(new RestStatus(OperationStatus.Success, "Output state send to GPIO controller"));
                                            }
                                        }
                                        else
                                            return HttpResource.JsonLocked423("Invalide channel number.");
                                    }
                                }
                            }
            

            https://github.com/100prznt/EzoGateway/blob/915775ffe9e7f52b15d0b02a984684e20d16cf16/source/EzoGateway/Server/HttpServer.cs#L626

            Der Call zum setzen eines Ausgangs sieht wie folgt aus:
            URL: http://<IP EZO Gateway>/api/output/<Kanalnummer>
            Methode: PUT
            Body:

            {
                State: <true oder false>
            }
            

            Abfrage erfolgt analog per GET, ohne Kanalnummer kommt ein Array mit allen Kanälen zurück.

            Hab das jetzt erstmal nur schnell runter geschrieben, ein Test an Hardware steht noch aus.

            Beste Grüße
            Elias

            J Offline
            J Offline
            JohnnyBahama
            wrote on last edited by
            #38

            @100prznt Danke, muss mir dann erstmal die Hardware organisieren.

            1 Reply Last reply
            0
            • 100prznt1 100prznt

              @johnnybahama Habe die Software soweit vorbereitet, liegt vorerst in einem eigenen Branch, falls du schon testen willst.

              Im IoDispatcher wird ein readonly Array definiert, welches die GPIO Nummern der "Ausgänge" definiert.

                      //GPIO pins in sequence for channel 1 to n.
                      //Pin 2 and 3 are reserved for I2C communication with the EZO circuit modules.
                      private readonly int[] OUT_PINS = { 5, 6, 13, 19, 26, 12 };
              

              https://github.com/100prznt/EzoGateway/blob/915775ffe9e7f52b15d0b02a984684e20d16cf16/source/EzoGateway/IoDispatcher.cs#L41

              Nach einem Systemstart werden die entsprechend definierten GPIOs initialisiert und können über die REST API bedient werden.
              Dazu gibt es im HttpServer eine neue Verzweigung:

                              else if (request.Uri.Segments.Length >= 3 && request.Uri.Segments[2].Trim('/').Equals("OUTPUT", StringComparison.OrdinalIgnoreCase))
                              {
                                  if (request.Uri.Segments.Length == 3 && request.Method == HttpMethod.Get)
                                  {
                                      var channelDict = new Dictionary<string, IoData>();
                                      for (int i = 0; i < m_Controller.Io.OutputChannelCount; i++)
                                          channelDict.Add((i + 1).ToString(), new IoData(m_Controller.Io.GetOutput(i + 1)));
              
                                      return HttpResource.CreateJsonResource(channelDict);
                                  }
                                  else if (request.Uri.Segments.Length == 4)
                                  {
                                      if (Int32.TryParse(request.Uri.Segments[3].Trim('/'), out int channel))
                                      {
                                          if (channel >= 1 && channel <= m_Controller.Io.OutputChannelCount)
                                          {
                                              if (request.Method == HttpMethod.Get)
                                              {
                                                  var state = new Dictionary<string, string>
                                                  {
                                                      { "state", m_Controller.Io.GetOutput(channel).ToString() }
                                                  };
                                                  return HttpResource.CreateJsonResource(state);
                                              }
                                              else if (request.Method == HttpMethod.Put)
                                              {
                                                  var ioData = JsonConvert.DeserializeObject<IoData>(request.Content);
                                                  m_Controller.Io.SetOutput(channel, ioData.State);
              
                                                  return HttpResource.CreateJsonResource(new RestStatus(OperationStatus.Success, "Output state send to GPIO controller"));
                                              }
                                          }
                                          else
                                              return HttpResource.JsonLocked423("Invalide channel number.");
                                      }
                                  }
                              }
              

              https://github.com/100prznt/EzoGateway/blob/915775ffe9e7f52b15d0b02a984684e20d16cf16/source/EzoGateway/Server/HttpServer.cs#L626

              Der Call zum setzen eines Ausgangs sieht wie folgt aus:
              URL: http://<IP EZO Gateway>/api/output/<Kanalnummer>
              Methode: PUT
              Body:

              {
                  State: <true oder false>
              }
              

              Abfrage erfolgt analog per GET, ohne Kanalnummer kommt ein Array mit allen Kanälen zurück.

              Hab das jetzt erstmal nur schnell runter geschrieben, ein Test an Hardware steht noch aus.

              Beste Grüße
              Elias

              J Offline
              J Offline
              JohnnyBahama
              wrote on last edited by JohnnyBahama
              #39

              @100prznt Relais Board is angekommen. Ich brauche hier deine Unterstützung, da ich von Programmieren keine Ahnung habe. Wie oder wohin muss ich den Code kopieren?

              100prznt1 1 Reply Last reply
              0
              • J JohnnyBahama

                @100prznt Relais Board is angekommen. Ich brauche hier deine Unterstützung, da ich von Programmieren keine Ahnung habe. Wie oder wohin muss ich den Code kopieren?

                100prznt1 Offline
                100prznt1 Offline
                100prznt
                wrote on last edited by
                #40

                @johnnybahama Welches Board hast du jetzt genau? Gibt es da konkrete Doku, insbesondere die GPIO Zuordnung müsste ich wissen.

                Beste Grüße
                Elias

                1 Reply Last reply
                0
                • J Offline
                  J Offline
                  JohnnyBahama
                  wrote on last edited by
                  #41

                  @100prznt Das 6ch Board

                  Dokumentation ist rar, dass einzige was ich finden konnte und so aussieht als wäre es das original: https://www.waveshare.com/wiki/RPi_Relay_Board

                  Dann noch Kommentare die es zum laufen bekommen haben. Die Kommentare sagen auch, dass das Waveshare nur 3 CH ist und das kommentierte 4 CH. Weiß jetzt nicht, ob es eine Synergie zu dem 6 CH gibt.

                  Ich such noch weiter.

                  1 Reply Last reply
                  0
                  • paul53P paul53

                    @JohnnyBahama sagte:

                    über den SIMPLE-API Adapter einbinden, ist der Gedankengang richtig?

                    Die Simple-API des ioBrokers erlaubt den Zugriff auf ioBroker-Datenpunkte über das Netzwerk von außen. Auf die Daten des EZOGateways sollte man per request() (Javascript-Adapter) zugreifen können.

                    const url = 'http://<IP address>/api/fetch'; // IP-Adresse eintragen !
                    const idTemp = '0_userdata.0.EZO.Temperatur';
                    const idPH = '0_userdata.0.EZO.PH-Wert';
                    const idRedox = '0_userdata.0.EZO.Redox-Potential';
                    
                    schedule('* * * * *', function() { // jede Minute
                        request(url, function(error, response, result) {
                            let obj = JSON.parse(result);
                            setState(idTemp, obj['1'].Value, true);
                            setState(idPH, obj['2'].Value, true);
                            setState(idRedox, obj['3'].Value, true);
                        });
                    });
                    
                    W Offline
                    W Offline
                    Wuschl
                    wrote on last edited by
                    #42

                    @paul53 Ich checke diesen Simple-API nicht. Das EZO läuft, aber ich bringe die Daten nicht in den ioBroker.
                    Wo habe ich den Denkfehler? In Javascript bekomme ich nur eine Fehlermeldung.

                    J 1 Reply Last reply
                    0
                    • W Wuschl

                      @paul53 Ich checke diesen Simple-API nicht. Das EZO läuft, aber ich bringe die Daten nicht in den ioBroker.
                      Wo habe ich den Denkfehler? In Javascript bekomme ich nur eine Fehlermeldung.

                      J Offline
                      J Offline
                      JohnnyBahama
                      wrote on last edited by
                      #43

                      @wuschl Hast du denn deine IP mit Port in der ersten Zeile angegeben?

                      W 1 Reply Last reply
                      0
                      • J JohnnyBahama

                        @wuschl Hast du denn deine IP mit Port in der ersten Zeile angegeben?

                        W Offline
                        W Offline
                        Wuschl
                        wrote on last edited by
                        #44

                        @johnnybahama Hab es hinbekommen, nachdem der Raspy nochmals neu gestartet wurde war alles da.

                        Jetzt habe ich noch eine Frage wegen dem kalibrieren. Ich habe 2 Flüssigkeiten 4.0 pH und 7.0 pH. Wenn ich die Messzelle in die Flüssigkeit stelle dann sinkt der Wert, aber dieser bleibt nicht bei einem Wert stehen. Ist das richtig? Bei meinem PH803W blieb der Wert irgendwann an einer Position stehen.
                        Welchen Wert muss ich eintragen in Reference Value?

                        Ist es zwingend nötig 10 pH auch zu kalibrieren?

                        J 1 Reply Last reply
                        0
                        • W Wuschl

                          @johnnybahama Hab es hinbekommen, nachdem der Raspy nochmals neu gestartet wurde war alles da.

                          Jetzt habe ich noch eine Frage wegen dem kalibrieren. Ich habe 2 Flüssigkeiten 4.0 pH und 7.0 pH. Wenn ich die Messzelle in die Flüssigkeit stelle dann sinkt der Wert, aber dieser bleibt nicht bei einem Wert stehen. Ist das richtig? Bei meinem PH803W blieb der Wert irgendwann an einer Position stehen.
                          Welchen Wert muss ich eintragen in Reference Value?

                          Ist es zwingend nötig 10 pH auch zu kalibrieren?

                          J Offline
                          J Offline
                          JohnnyBahama
                          wrote on last edited by
                          #45

                          @wuschl Als Referenz kommt der Wert, der auf der Kalbrierflüssigkeitspackung steht.
                          Nein 10 musst du nicht kalibrieren. Entweder 4 oder 10. 7 ist muss.
                          Das Schwanken kannst du im live window prüfen. In der Regel sollte der immer um den Wert von der Kalibrierflüssigkeit herum tanzen .

                          1 Reply Last reply
                          0
                          • J Offline
                            J Offline
                            JohnnyBahama
                            wrote on last edited by JohnnyBahama
                            #46

                            EDIT: Problem gelöst. Siehe nächsten Post.

                            1 Reply Last reply
                            0
                            • J Offline
                              J Offline
                              JohnnyBahama
                              wrote on last edited by JohnnyBahama
                              #47

                              Mit ChatGPT wieder zum laufen bekommen:

                              const axios = require('axios'); // axios importieren
                              
                              const url = 'http://<EZO IP Adress>/api/fetch'; // IP-Adresse eintragen !
                              const idTemp = 'javascript.0.EzoGateway.Temperatur'; // Ändern, wenn der Datenpunkt woanders liegen soll
                              const idPH = 'javascript.0.EzoGateway.PH-Wert';// Ändern, wenn der Datenpunkt woanders liegen soll
                              const idRedox = 'javascript.0.EzoGateway.Redox-Potenzial';// Ändern, wenn der Datenpunkt woanders liegen soll
                              
                              schedule('*/1 * * * *', async function() { // every minute
                                  try {
                                      let response = await axios.get(url);
                                      let obj = response.data;
                                      setState(idTemp, obj['1'].Value, true);
                                      setState(idPH, obj['2'].Value, true);
                                      setState(idRedox, obj['3'].Value, true);
                                  } catch (exMsg) {
                                      log(exMsg, 'error');
                                  }
                              });
                              
                              // Erzeugen der Objekte in ioBroker. Kann nach dem ersten Start des Skriptes gelöscht werden.
                              createState(idTemp, 0, {
                                  name: 'Temperatur',
                                  desc: 'Temperatur',
                                  type: 'number',
                                  role: 'value',
                                  unit: '°C'
                              });
                              createState(idPH, 0, {
                                  name: 'pH_Wert',
                                  desc: 'pH Wert',
                                  type: 'number',
                                  role: 'value',
                                  unit: ''
                              });
                              createState(idRedox, 0, {
                                  name: 'Redox_Potential',
                                  desc: 'Redox potential',
                                  type: 'number',
                                  role: 'value',
                                  unit: 'mV'
                              });
                              
                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              268

                              Online

                              32.7k

                              Users

                              82.6k

                              Topics

                              1.3m

                              Posts
                              Community
                              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                              ioBroker Community 2014-2025
                              logo
                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Home
                              • Recent
                              • Tags
                              • Unread 0
                              • Categories
                              • Unreplied
                              • Popular
                              • GitHub
                              • Docu
                              • Hilfe