Analyse der Daten des Stromzählers Eastron SDM220 mit ThingSpeak

    Hallo allerseits. In einem Artikel über geektimes habe ich darüber gesprochen, wie man einen Eastron SDM220-Modbus- Stromzähler anschließt und Daten von ihm über den RS-485-Bus sammelt. Heute möchte ich über die Erhebung und Analyse von Statistiken zum Stromverbrauch im Haus sprechen.



    Als Heimnetzwerk für die Datenerfassung habe ich den Centerm GI-945 Thin Client verwendet . Seine Vorteile sind x86-Architektur (Atom 1,6 GHz), 5 USB, 1G Ethernet, Mini-PC (stecken Sie eine WLAN-Karte hinein). Ubuntu Server 14.04 wird von einem Flash-Laufwerk geladen.





    Über den USB-RS485- Adapter wird ein Stromzähler an den „Server“ angeschlossen. Poll Counter erstellt ein Skript in Python, basierend auf diesem Beispiel . Das Skript benötigt die pyModbus- Bibliothek

    Bibliotheksinstallation
    das die apt-sudo-PPA - Repository hinzufügen: fkrull / deadsnakes-python2.7
    die apt-sudo das Update erhalten
    sudo apt-Upgrade erhalten die

    apt-die die Installation -y für python-pip bekommen ist
    die apt-die die python2.7-dev installieren lassen

    pip ist die Installation von -U pymodbus

    Das Skript wird von laufen cron einmal pro Minute, nimmt Daten (Spannung, Strom, Leistung und Energie berücksichtigt werden) mit einem Zähler und schickt sie auf eine Website ThingSpeak .

    Erstellen Sie auf der Site, auf der Sie sich zuerst registrieren müssen, Ihren eigenen Kanaldatenkanal und benennen Sie die Felder Felder . Zum Schreiben von Daten in den Kanal benötigen Sie außerdem den Schreib-API-Schlüssel .



    Python-Skriptcode
    #! / usr / bin / python2
    import struktur import
    pymodbus.client.sync
    import binascii
    import zeit
    import sys
    import urllib

    def read_float_reg (client, basereg, unit = 1):
    resp = client.read_input_registers (basereg, 2, unit = 1)
    Wenn resp == None:
    return None
    # gemäß Spezifikation,
    codiert jedes zurückgegebene Registerpaar # einen IEEE754-Float, wobei das erste Register
    # die höchstwertigen 16 Bits enthält, das zweite Register
    # die niedrigstwertigen 16 Bits.
    return struct.unpack ('> f', struct.pack ('> HH', * resp.registers))

    def fmt_or_dummy (regfmt, val):
    wenn val None ist:
    return '.' * len (regfmt [2]% (0))
    Rückgabe regfmt [2]% (val)

    def main ():
    regs = [
    # Symbol Reg # Format
    ('V:', 0x00, '% 6.2f'), # Spannung [V]
    ('Curr:', 0x06, '% 6.2f'), # Aktuell [A]
    ('Pakt:', 0x0c, '% 6.0f'), # Wirkleistung [W]
    ('Papp:', 0x12, '% 6.0f '), # Scheinleistung ("Scheinl.") [W]
    (' Prea: ', 0x18,'% 6.0f '), # Blindleistung ("Blindl.") [W]
    (' PF: ', 0x1e, '% 6.3f'), # Leistungsfaktor [1]
    ('Phi:', 0x24, '% 6.1f'), # cos (Phi)? [1]
    ('Freq:', 0x46, '% 6.2f'), # Netzfrequenz [Hz]
    ('Wact:', 0x0156, '% 6.2f'), # Energie [kWh]
    ('Wrea:', 0x0158, '



    port = '/ dev / ttyUSB0', Baudrate = 9600, Parität = 'N', Stoppbits = 1,
    Timeout = 0,8)

    values ​​= [read_float_reg (cl, reg [1], unit = 1) für reg in regs]
    outvals = list (('' .join ([fmt_or_dummy (* t) für t in zip (regs, values)])) split ())
    params = urllib.urlencode ({'key': 'xxxxxxxxxxxxxxxx', 'field1': outvals [0], 'field2': outvals [1], 'field3': outvals [2], 'field4': outvals [8]})
    f = urllib.urlopen (" api.thingspeak.com/update ", data = params)
    print (outvals)
    sys.stdout.flush ()


    if __name__ == '__main__':
    main ()

    Das Skript übernimmt alle verfügbaren Parameter vom Zähler, aber nur die wichtigsten werden auf die Site übertragen. Wenn Sie möchten, können Sie alles übertragen.

    Das Ergebnis wird sofort auf der Site angezeigt (auf dem Bildschirm werden einige Zeit lang Statistiken angezeigt, während der ersten Umfrage wird nur ein Punkt mit einem Wert



    angezeigt ). Standardmäßig werden in den Diagrammen die letzten 60 Messwerte angezeigt, die bei einer einmaligen Abfrage pro Minute das Ergebnis für die letzte Stunde ergeben. Für jedes Diagramm können Sie die Anzeige konfigurieren.Für die



    Spannung habe ich eine Statistik für 6 Stunden mit einem Durchschnitt von über 10 Werten und einer Glättung der Kurve (Spline) erstellt.

    Es ist zu sehen, dass die Kurve des Energieverbrauchs immer größer wird, aber ich möchte den Verbrauch für eine Stunde, einen Tag und einen Monat sehen. Dazu gibt es Analysen auf der Site, die auf der MATLAB-Engine und der Fähigkeit basieren, Ereignisse rechtzeitig auszuführen.

    Um stündliche Statistiken zu sammeln, habe ich Folgendes getan:

    1. Erstellt den zweiten PowerStatistic- Kanal .

    2. In Apps -> MATLAB Analysis wurde ein Skript erstellt, das den aktuellen Energiewert nimmt und diesen vor einer Stunde abzieht. Das Ergebnis wird in das Kanalfeld eingegeben;

    3. In Apps -> Time Control wurde das Ereignis GetPowerPerHour erstellt , bei dem stündlich um 00 Minuten ein matlab-Skript ausgeführt wird.

    PowerPerHour-Skript
    % ID des
    Quellkanals, in dem Daten vom Zähler abgelegt werden. Wenn der Kanal privat ist, müssen Sie Read API Key angeben. ReadChannelID = 154291;

    % Channel ID zur Aufzeichnung verarbeiteter Daten (PowerStatistic)
    writeChannelID = 157182;
    writeAPIKey = 'xxxxxxxxxxxxxxxxxx';

    %% Read Data %% data1
    = thingSpeakRead (readChannelID, 'Fields', 4);
    data2 = thingSpeakRead (readChannelID, 'Fields', 4, 'NumMinutes', 60);
    Wert = Daten1 - Daten2 (1);

    % in data1 lesen wir den letzten Wert aus dem 4. Feld (Energie)
    % lesen data2 ist schief, aber ich habe noch nicht an einen anderen gedacht, die letzten 60 Werte werden gelesen (pro Stunde) und der erste von ihnen wird genommen

    %% Daten analysieren %%
    % musste eine Rundung auf zwei Stellen hinzufügen, da das Subtraktionsergebnis aus irgendeinem Grund so aussah, obwohl die Werte im ursprünglichen Array auf zwei Dezimalstellen gerundet wurden: 0.27000000000031 analysedata
    = round (value, 2);

    % disp kann zum Debuggen von Daten verwendet werden.
    % disp (analysierteDaten);

    Wenn die analysierten Daten einen Wert und keinen Vektor haben, werden sie in das erste Feld des Kanals geschrieben. Um in andere Felder zu schreiben, fügen Sie beispielsweise 'Felder' 2 hinzu.
    %% Write Data %%
    thingSpeakWrite (writeChannelID, analysedData, 'WriteKey', writeAPIKey);

    Es gibt einen unangenehmen Pfiff auf der Site, es gibt eine Schaltfläche zum Speichern und Ausführen zum Anwenden des Skripts , die bei jedem Start in den Kanal geschrieben wird. Es ist also besser, die Aufnahmezeile vor dem vollständigen Debuggen zu kommentieren, aber selbst wenn das Skript fertig ist, können Sie es nicht einfach speichern, ohne es zu starten, und das Skript wird sofort gestartet in den Kanal. Es ist auch nicht möglich, einzelne Daten aus dem Kanal zu löschen. Dieses Problem wurde bereits im Projektforum angesprochen , aber noch nicht behoben.



    Geplante Starteinstellungen, das Skript wird stündlich ausgeführt. Die Tatsache, dass der Start um 12.00 Uhr erfolgt, kann ignoriert werden.

    Wir sehen uns das Ergebnis im Kanal an:



    Für dieses Diagramm wird in den Einstellungen die Spalte Typ angegebenum den stundenweisen Stromverbrauch anzuzeigen. Das Popup-Fenster entspricht der Verbrauchsspitze um 12 Uhr (der Cursor auf dem Bildschirm wurde nicht angezeigt).

    Das Skript, das Statistiken pro Tag sammelt, funktioniert auf ähnliche Weise. Das Skript wird täglich um 00:01 Uhr ausgeführt und fasst 24 Lesungen aus dem stündlichen Archiv zusammen.

    PowerPerDay-Skript
    readChannelID = 157182;
    readAPIKey = 'zzzzzzzzzzzzzzzzzzzzz';

    writeChannelID = 157182;
    writeAPIKey = 'xxxxxxxxxxxxxxxxxxxx';

    %% Read Data %%%
    liest die letzten 24 Werte aus dem ersten Feld der
    Kanaldaten = thingSpeakRead (readChannelID, 'ReadKey', readAPIKey, 'Fields', 1, 'NumPoints', 24);

    Analysieren von Daten %% %%
    % summarise
    analyzedData = Summe (Daten);

    % disp (analysedData);

    %% Write Data %%
    thingSpeakWrite (writeChannelID, analysedData, 'WriteKey', writeAPIKey, 'Fields', 2);

    ThingSpeak hat auch Android Apps. Ich mochte Pocket IoT , um die neuesten Werte anzuzeigen , und ThingView für Diagramme . Es gibt auch ein paar Widgets, aber sie sind eine Art Kurven.

    »Channel PowerMeter
    » Channel PowerStatistic

    Das ist vielleicht alles. Der Artikel gibt nicht vor, ein Tutorial zu sein, da ich mich gerade erst mit den Funktionen von ThingSpeak vertraut gemacht habe. Ergänzungen, Kommentare und Änderungen sind willkommen.

    Jetzt auch beliebt: