Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Praktische Anwendungen (Showcase)
    4. Ströme im Schaltschrank induktiv messen und ESP an iobroker übergeben

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Ströme im Schaltschrank induktiv messen und ESP an iobroker übergeben

    This topic has been deleted. Only users with topic management privileges can see it.
    • hg6806
      hg6806 Most Active last edited by

      Schönen guten Tag zusammen,

      hier wollte ich mal mein nächstes Projekt vorstellen.

      Und zwar habe ich schon immer eine Möglichkeit gesucht im Schaltschrank (Sicherungskasten), bzw. andere Leitungen strommässig, und somit auch leistungsmässig zu erfassen und zu loggen.

      Erst dachte ich an einen ACS712, hierfür muss aber die Leitung aufgetrennt werden, da der ACS712 eher als Shunt fungiert.

      Somit bin ich auf die induktiven Stromsensoren SCT013 gestoßen. Die werden wie eine Stromzange um die Leitung geklappt.

      Die man aber hier AC hat, kann man das nicht einfach mit dem ADC Eingang des ESP messen, da zu langsam, sondern muss es öfters samplen und eben einen Wert daraus bilden.

      Das schafft aber locker der Arduino.

      Hier gibt es schon dafür einen fertige Doku:

      http://www.homautomation.org/2013/09/17 … d-arduino/

      Das Ding habe ich mit einem 15A Typ nachgebaut und hat erstaunlich gut und genau funktioniert.

      Jetzt die Frage wie man das über den ESP an ioBroker übergibt.

      Hier bietet sich I2C an.

      Also alles verdrahtet, 2k2 PullUp an 3V3 des ESP gehängt und an den Arduino angeschlossen.

      In EasyESP gibt es unter Devices "ProMiniExtender" mit dem man I2C Daten ausgeben kann.

      Den Arduino Code habe ich wie folgt verändert:

      
      #include "EmonLib.h"                   // Include Emon Library
      #include <wire.h>EnergyMonitor emon1;                   // Create an instance
      
      void setup()
      {  
        Serial.begin(9600);
        Wire.begin(2);
        emon1.current(1, 15);             // Current: input pin, calibration.
      }
      
      void loop()
      {
        int Irms = emon1.calcIrms(1480);  // Calculate Irms only
      
        Serial.print(Irms*230.0);         // Apparent power
        Serial.print(" ");
        Serial.println(Irms);          // Irms
      
        Wire.beginTransmission(2);//Start des Master mit dem Sende an Adresse 2
        Wire.write(Irms);
        Wire.endTransmission();
      
      }</wire.h> 
      

      Leider kann man keine double Variable per I2C übergeben, aber dazu später.

      Ein I2C Scan hat mit die Adresse 2 bestätigt, Daten müssten also ankommen, aber leider kann ich keinen Daten an dem Device ProMiniExtender sehen. Weiß jemand wie man den einstellt? Ist "Port" die I2C Adresse?

      Wenn alles läuft würde ich auf den ADS1115 gehen, da dieser genauer misst. Aber dazu auch später.

      1 Reply Last reply Reply Quote 0
      • hg6806
        hg6806 Most Active last edited by

        So, hab's hinbekommen.

        Für den PME (ProMiniExtender) muss man die Adresse 0x7F nehmen, dann erkennt EasyESP auch einen PME.

        Ich habe mir von hier:

        http://www.letscontrolit.com/forum/view … 0-%20p6463

        ..den Code genommen und entsprechend den Code für den CT implementiert und etwas abgespeckt, soweit ich den Code verstanden habe.

        Dabei ist folgendes herausgekommen:

        /********************************************************************************************************************\
         * Arduino project "ESP Easy" Copyright www.esp8266.nu
         *
         * This program is free software: you can redistribute it and/or modify it under the terms of the GNU 
         * General Public License as published by the Free Software Foundation, either version 3 of the License, 
         * or (at your option) any later version.
         * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
         * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
         * See the GNU General Public License for more details.
         * You received a copy of the GNU General Public License along with this program in file 'License.txt'.
         *
         * IDE download    : https://www.arduino.cc/en/Main/Software
         * ESP8266 Package : https://github.com/esp8266/Arduino
         *
         * Source Code     : https://sourceforge.net/projects/espeasy/
         * Support         : http://www.esp8266.nu
         * Discussion      : http://www.esp8266.nu/forum/
         *
         * Additional information about licensing can be found at : http://www.gnu.org/licenses
        \******************************************************************************************************************/
        // This file is to be loaded onto an Arduino Pro Mini so it will act as a simple IO extender to the ESP module.
        // Communication between ESP and Arduino is using the I2C bus, so only two wires needed.
        // It is possible to run the Pro Mini on 3V3, although the 16MHz versions do not officially support this at 16MHzl 
        // By working on 3.3volt  you can skip levelconverters on I2C, but no guarantee that it will work stable.
        // Arduino Mini Pro uses A4 and A5 for I2C bus. ESP I2C can be configured but they are on GPIO-4 and GPIO-5 by default.
        
        #include <wire.h>#include "EmonLib.h"
        
        #define I2C_MSG_IN_SIZE    4
        #define I2C_MSG_OUT_SIZE   4
        
        #define CMD_ANALOG_READ    4
        
        volatile uint8_t sendBuffer[I2C_MSG_OUT_SIZE];
        int ESPrms;                                                          // value to be sent over I2C to ESP
        
        EnergyMonitor emon1;                   // Create an instance
        
        void setup()
        {
          Serial.begin(9600);
          emon1.current(1, 15);             // Current: input pin, calibration.
        
          Wire.begin(0x7f);
          Wire.onReceive(receiveEvent);
          Wire.onRequest(requestEvent);
        }
        
                                      // relative zero of the ACS712 for me 514 was best.  511 
        int valueRead;                                                 // value read on ADC
        
        void loop()
        {
        
        int Irms = emon1.calcIrms(1480)*1000;  // Calculate Irms only
        
          Serial.print(Irms*230.0);         // Apparent power
          Serial.print(" ");
          Serial.println(Irms);          // Irms
        
         unsigned int count = 0;
        
          ESPrms = Irms;            // conversion of float Ampere into integer milliAmpere needed for I2C communication
        }
        
        void receiveEvent(int count)
        {
          if (count == I2C_MSG_IN_SIZE)
          {
            byte cmd = Wire.read();
            byte port = Wire.read();
            int value = Wire.read();
            value += Wire.read()*256;
            switch(cmd)
              {      
                case CMD_ANALOG_READ:
                  clearSendBuffer();
                  if (port <= 4) valueRead = ESPrms*230/1000;  // port <=4 to read analog value A0,A1,A2,A3 - A4 & A5 are I2C
                  if (port == 100) valueRead = ESPrms;           // port is any number >4 up to 255
                  sendBuffer[0] = valueRead & 0xff;
                  sendBuffer[1] = valueRead >> 8;
                  break;
              }
          }
        }
        
        void clearSendBuffer()
        {
          for(byte x=0; x < sizeof(sendBuffer); x++)
            sendBuffer[x]=0;
        }
        
        void requestEvent()
        {
          Wire.write((const uint8_t*)sendBuffer,sizeof(sendBuffer));
        }</wire.h> 
        

        Damit funktioniert es. Über den MQTT Adapter wird sauber der Datenpunkt von EasyESP eingetragen, ich habe nun auf meinem VIS einen Wert (Strom oder Leistung)

        Jetzt habe ich erst einmal einen ADS1115 bestellt und auch weitere SCT und mache auch erst einmal die HW schön.

        Ach ja, wer das nachbauen möchte. Aufpassen mit der I2C. Hier sollte man, wie schon geschrieben die PullUps an die 3V3 des ESP hängen.

        Somit sollte auch ein Power Sequencing stattfinden. Arduino zuerste bzw. zusammen mit dem ESP. Nicht dass der ESP zuerst gepowert wird und dann den Arduino über die PullUps mit 3V3 versorgt.

        Ich weißt nicht ob die Ports das aushalten.

        Bei Fragen einfach melden.

        Viele Grüße

        1 Reply Last reply Reply Quote 0
        • G
          galferiz last edited by

          Interessanter Ansatz, und sicher eine kostengünstigere Lösung als diverse Stromzähler 😉

          1 Reply Last reply Reply Quote 0
          • Dutchman
            Dutchman Developer Most Active Administrators last edited by

            absolut, die frage kommt dan aber bei mir hoch ob man mehrere sensoren verbouwen kan oder dafuer von allem doppelte hardware braucht ?

            1 Reply Last reply Reply Quote 0
            • hg6806
              hg6806 Most Active last edited by

              Der Sensor hängt momentan an einem Arduino nano, der hat 8 analoge Inputs. Die I2C Schnittstelle ist allerdings auch an diesen Ports angeschlossen, wären also noch 6 übrig, wobei man I2C evtl. auch auf anderen Ports laufen lassen kann.

              In der SW braucht man da nicht viel ändern, wenn man mehrere Sensoren ausließt

              Später würde ich das Ganze an einen ADS1115 anschließen, der hat 4 ADCs. Hiervon kann man aber auch wiederum mehrere an den Arduino anschließen.

              Kosten:

              Sensor 7,- und in China 4-5,-

              ADS1115 5-6,- und in China 2-3,-

              1 Reply Last reply Reply Quote 0
              • Chaot
                Chaot last edited by

                Hast du die Version immer noch in Betrieb?

                Lässt sich das auch mit 3 Phasen verwirklichen oder brauche ich dafür 3 solche Aufbauten?

                1 Reply Last reply Reply Quote 0
                • P
                  ple last edited by

                  Würde mich auch interessieren. Bräuchte so 10 Messstellen.

                  1 Reply Last reply Reply Quote 0
                  • hg6806
                    hg6806 Most Active last edited by

                    Hatte mir für meine 2 Stromzähler zwei IR Köpfe bestellt und diese per USB mit dem Pi verbunden. Hier sehe ich den genauen Stromverbrauch der Wärmepumpe und des Allgemeinstroms.

                    Zudem habe ich einen Wemos D1 mit einem Arduino und 4 verschiedene (5A/30A/10A/15A) Stromklemmen aufgebaut um einzelne Stränge zu messen, mehr geht wohl pro Arduino nicht.

                    Leider ist das Ganze nicht ganz genau, da hier eigentlich auch die Phase gemessen werden müsste wegen der Blindleistung.

                    Es gibt aber bestimmt auch dafür Lösungen im Netz.

                    Habe aber im Moment andere wichtigere Baustellen zumal mir diese Genauigkeit eigentlich reicht.

                    Wer wegen dem 4-fach Aufbau mehr Infos braucht kann mich ja gerne anschreiben oder ich poste das hier bei Interesse.

                    1 Reply Last reply Reply Quote 0
                    • First post
                      Last post

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    809
                    Online

                    31.7k
                    Users

                    79.7k
                    Topics

                    1.3m
                    Posts

                    5
                    8
                    6986
                    Loading More Posts
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes
                    Reply
                    • Reply as topic
                    Log in to reply
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                    The ioBroker Community 2014-2023
                    logo