Monitoring des Stromverbrauch

Datum: 22.12.2021

Projektbeschreibung:

Die Idee zu dieser Seite:

Bei der Vorbereitung der Installation und Sizing sowie im späteren Betrieb einer Solaranlage sind Verbrauchsmessungen nützlich und notwendig. So kann unter Bezugnahme auf den Strom als Energiequelle

a.)   die Dimension der Kollektoren

b.)   die Energiespeicherung in

a.     Batterien und

b.     Warmwasserspeichern sowie der

c.)    Mindestverbrauch durch ständige Verbraucher wie

a.     Kühlaggregate

b.     Pumpen im Heizbetrieb etc

d.)   der planbare Stromverbrauch von optional aktivierbaren Verbrauchern wie

a.     Spülmaschine

b.     Waschmaschine

c.      Wäschetrockner

d.     Herd etc

e.)   der Brutto Strombezug aus

a.     dem Netz (am smart meter)

b.     aus den Batterien

 

erhoben und in Abhängigkeit von Jahreszeit und aktueller bzw. vorhergesagter Witterung bzw. Sonnenabdeckung analysiert und optimiert werden. Alles unter der Maßgabe möglichst viel an Solarstrom selbst zu verbrauchen. Denn die Einspeisung in das öffentliche Netz wirft immer weniger Ertrag ab. Das macht nur Sinn, wenn Erzeugung, Verbrauch und Pufferung in Energiespeichern in langfristige und ad hoc Analysen und Steuerungen einfließen. Das kann nur auf Basis einer richtigen Taxonomie und gesammelten Daten aus granular ausreichend gewählten Zeitperioden erfolgen.

Hier besprechen wir den ersten Schritt, nämlich die Messung von Stromverbrauchern. Das geschieht unter Verwendung folgender Komponenten:

Hardware:

·       Smart Sockets der Vertriebsfirma „Nous“ für 3450 Watt mit ESP8266 Chip. Das sind Clones der Gosund SP111.

·       RaspBerry PI 4 B, wie er in der Industrie in Produktionsprozessen verwendet wird. Mit 64 Bit OS RaspBian vom 30.11.2021

·       Zwei Shelly 1 PM WLAN Schalter  (eingebauter ESP2866) mit Watt Messfunktion mit je bis zu drei Temperarursensoren GIAK DS18B20

·       ESP2866 und BME280 zur Überwachung der Temperaturumgebung der Speicherbatterie

Software:

·       Mosquitto  MQTT Broker

·       Mosquitto Client (zum Testen)

·       Telegraf Connector

·       InfluxDB Zeitreihendatenbank

·       Grafana Visualisierung der Daten auf Web Frontend

·       Tuya convert ESP mit Tasmota firmware via WLAN flashen (Heise ct) oder direkt per FTDI und Draht. Das Device SP111 kann zu diesem Zweck einfach  aufgeschraubt werden.

Protokolle

·       MQTT als Transport

·       JSON als Datenformat

·       InfluxQL als Datenbankadministrations- und Datenzugriffsprotokoll

·       Die unten aufgezeigten Konfigurationsdateien und Hinweise sollen Interessierten eine Erstinstallation erleichtern und helfen, Zeit zu gewinnen. Security Aspekte habe ich ausgespart.

 

Die Installation bleibt also im lokalen WLAN, wenn im Router eine Verbindung in die Außenwelt für die Smart Sockets unterbunden wird (Stichwort Kindersicherung). In DHCP auf dem Router für alle integrierten Komponenten feste DHCP Adressen konfigurieren.

Auch die smart sockets sind über das WLAN integriert:

Bild 1 - NOUS Smart WiFi Steckdose 15A 3450W Tasmota

 

Das Flashen der Messgeräte (nous smart sockets) durch die Tasmota firmware mittels tuya convert ist auf github auf dem ct Link https://github.com/ct-Open-Source/tuya-convert präzise beschrieben. Sogar noch etwas kleinteiliger hier: https://www.simon42.com/tuya-convert-tasmota-firmware-smart-life/. 

Diesen Schritt überspringen wir hier. Das Ergebnis sieht für die mqtt Konfiguration des verwendeten Beispielsteckers so aus:

Das template aus https://templates.blakadder.com/plug.html ist in unserem Gerät wie folgt:

{"NAME":"NOUS A1","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45}

 

Hinweis: Sollte sich das Device nach dem Flashen irgendwann einmal „tot stellen“; dann hilft das 6 malige An-Aus Schalten (am besten auf einer schaltbaren Steckerleiste)  und zwar so, dass jeweils die Leuchtdioden nach dem Anschalten kurz aufblitzen. Danach ist das Device wieder als Access Point aktiv und man kann die WLAN Konfiguration mit SSID und pwd erneut eingeben. Beim Flashen über WLAN bzw. OTA (over the air) kann es  angeblich noch Code Reste von firmenseitiger Software geben. Dann mittels eines USB FTDI für ein paar Euro per Kabel flashen.

 

Nun zu den Konfigurationsdateien:

Ein Hinweis vorweg: Keine loopback IP Adresse 127.1 oder localhost verwenden. Weder als Programmparameter noch als Attribut in der Konfiguration. Immer die IP Adresse oder den hostname verwenden. Ggfs in den conf Dateien oder in den Skripten anpassen.

Als Voraussetzung auf dem Raspberry folgende Komponenten zur Boot Zeit und in der angegebenen Reihenfolge starten: Mosquitto, influxdb und telegraf.

#  mosquitto.conf Place your local configuration in /etc/mosquitto/conf.d/

#

# A full description of the configuration file is at

# /usr/share/doc/mosquitto/examples/mosquitto.conf.example

pid_file /run/mosquitto/mosquitto.pid

allow_anonymous true

persistence true

persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log

include_dir /etc/mosquitto/conf.d

listener 1883 raspi4

 

Wenn wir mehrere topics Protokolle als mqtt_consumer anmelden wollen, benötigen wir einfach mehrere Client_IDs in den gleichnamigen Abschnitten.

#telegraf.conf

[global_tags]

 

[agent]

  interval = "10s"

  round_interval = true

  metric_batch_size = 1000

  metric_buffer_limit = 10000

  collection_jitter = "0s"

  flush_interval = "10s"

  flush_jitter = "0s"

  precision = ""

  debug = true

  hostname = ""

  omit_hostname = false

 

[[outputs.influxdb]]

  urls = ["http://raspi4:8086"]

  database = "consumer"

  username = "power"

  password = "Power"

  skip_database_creation = false

 

[[inputs.mqtt_consumer]]    #Shelly 1PM

  servers = ["tcp://192.168.0.42:1883"]

#   ## Topics that will be subscribed to.

   topics = [

    "shellies/temper2.topic06/ext_temperature/0",

    "shellies/temper2.topic06/ext_temperature/1",

   ]

data_format = "value"

data_type = "float"

client_id = "CLIENT1"

 

[[inputs.mqtt_consumer]] # ESP8266 mit BME280

   servers = ["tcp://192.168.0.42:1883"]

   topics = [

    "Garage_0/SENSORS/#",

   ]

data_format = "value"

#data_format = "json"

data_type = "float"

client_id = "Garage"

 

# # Read metrics from MQTT topic(s)

[[inputs.mqtt_consumer]]  #Gosund SP111 bzw. Nous A1

   servers = ["tcp://192.168.0.42:1883"]

   topics = [

    "socket01topic01/SENSOR",

    "socket02topic02/SENSOR",

    "socket03topic03/SENSOR",

    "socket04topic04/SENSOR",

   ]

data_format = "json"

client_id = "CLIENT2"

#data_format = "influx"   data_format = "json"

qos = 2

 

#Ende telegraf.conf

Das Format der Werte in der Tasmota mqtt Nachricht sieht so aus:

{"Time":"2021-12-22T13:14:43","ENERGY":{"TotalStartTime":"2021-12-17T15:01:43","Total":0.029, "Yesterday":0.000,"Today":0.029,"Period":0,"Power":14,"ApparentPower":37, "ReactivePower":34,"Factor":0.38,"Voltage":237,"Current":0.156}}

Zu den einzelnen Werten und Einheiten siehe die Erklärung hier:

https://www.allaboutcircuits.com/textbook/alternating-current/chpt-11/true-reactive-and-apparent-power/

und https://tasmota.github.io/docs/

------------------------------------------------

#In influx Database Anmeldung mit Retention Strategie hinter dem Datenbanknamen und Punkt als Trenner.

In der SELECT Clause die "Tabelle" angeben, die sich auf die mqtt telegraf input Konfiguration bezieht.

Nach Aufruf von influx aus der shell:

> auth

User: <userid>

Password: <password>

> use consumer.autogen

> select * from mqtt_consumer

Output:

name: mqtt_consumer

time                ENERGY_ApparentPower ENERGY_Current ENERGY_Factor ENERGY_Period ENERGY_Power ENERGY_ReactivePower ENERGY_Today ENERGY_Total ENERGY_Voltage ENERGY_Yesterday host   topic

----                -------------------- -------------- ------------- ------------- ------------ -------------------- ------------ ------------ -------------- ---------------- ----   -----

1640175493810959310 36                   0.151          0.39          0             14           33                   0.03         0.03         237            0                raspi4 socket01topic01/SENSOR

1640175523834772277 35                   0.147          0.37          0             13           33                   0.03         0.03         239            0                raspi4 socket01topic01/SENSOR

1640175553814674913 37                   0.154          0.36          0             13           34                   0.03         0.03         239            0                raspi4 socket01topic01/SENSOR

1640175583839373655 36                   0.151          0.32          0             11           34                   0.03         0.03         238            0                raspi4 socket01topic01/SENSOR

1640175613801732510 36                   0.151          0.36          0             13           34                   0.03         0.03         237            0                raspi4 socket01topic01/SENSOR

1640175643950973619 41                   0.172          0.3           0             12           39                   0.03         0.03         238            0                raspi4 socket01topic01/SENSOR

1640175673824570453 38                   0.159          0.36          0             14           35                   0.031        0.031        239            0                raspi4 socket01topic01/SENSOR

1640175703853490766 34                   0.143          0.35          0             12           32                   0.031        0.031        239            0                raspi4 socket01topic01/SENSOR

1640175733850503063 35                   0.149          0.34          0             12           33                   0.031        0.031        238            0                raspi4 socket01topic01/SENSOR

1640180143842280939 38                   0.158          0.36          0             14           35                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180173846093040 37                   0.154          0.32          0             12           35                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180203801818723 40                   0.167          0.4           0             16           37                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180233806270467 40                   0.169          0.34          0             14           38                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180263818522050 41                   0.173          0.32          0             13           39                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180294063959884 38                   0.158          0.36          0             14           35                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180323802163785 37                   0.155          0.32          0             12           35                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

1640180353809689615 38                   0.159          0.36          0             14           36                   0.049        0.049        239            0                raspi4 socket01topic01/SENSOR

-----------------------

Hier ein Teil der Web based Grafana Konfiguration online mit diesem bzw. ähnlichen SELECT für die Nous A1 Smart Sockets angeben in der Admin GUI

SELECT mean("ENERGY_Power") FROM "autogen"."mqtt_consumer" WHERE ("topic" = 'socket01topic01/SENSOR') AND $timeFilter GROUP BY time($__interval) fill(null)

Einheit Watt für das Display auswählen

Für die TemperaturMessung via BME280:

Im WebFrontEnd des mit ESPEasy geflashten ESP8266 das BME280 Device eintragen:

 

 

Humidity ist auf 0, weil es sich um einen BMP280 handelt: Augen auf beim Komponentenkauf! Als MQTT Controller sollte openHAB gewählt sein.

Der mosquitto log verrät Quelle und Topic Name:

Received PUBLISH from Garage_0 (d0, q0, r0, m0, 'Garage_0/SENSORS/Temperature', ... (5 bytes))

Hier nun die Grafana Abfrage:

SELECT mean("value") FROM "autogen"."mqtt_consumer" WHERE topic='Garage_0/SENSORS/Temperature'  AND $timeFilter GROUP BY time($__interval) fill(null)

 

Hier unten eine einfache Grafana Dashboard Anzeige mit vier eingesetzten Sockets.

Die Zeitreihe der Verbrauchswerte über den Tag für jeden Socket einzeln.

Kühlschrank weist das typische Muster eines Dauerverbrauchers auf – hier: (Tief)Kühl Kombi.

Spülmaschine läuft und der Rest verbraucht 1 W für den Betrieb des Smart Socket.

Ein Bild, das Text, drinnen, schwarz enthält.

Automatisch generierte Beschreibung