Verbruik elektrische auto uitlezen m.b.v. Eastron sdm120m kWh meter

Last Updated on 28 april 2023 by Syds

Dit project heeft tot doel om het verbruik van mijn electrische auto, en nog wat aanvullende gegevens, uit te lezen uit een Eastron sdm120m kWh meter die ik voor dat doel heb aangeschaft, en te presenteren in een mooi dashboard. Dit project borduurt voort op het project “Opbrengst zonnepanelen uitlezen“, voor meer info over het uitlezen van een RS485 modbus m.b.v. een FT232RL-adapter en een linux doosje verwijs ik je graag naar die blog.

Aan de buitenmuur van mijn woning hangt een Laadpaal van Laadstation24. Een één-fasige laadpaal die op een 25A installatieautomaat aangesloten is in mijn meterkast. Tussen deze laadpaal en de installatieautomaat plaats ik een Eastron sdm120m kWh meter zodat ik exact de hoeveel watts die mijn elektrische auto consumeert tijdens een oplaadbeurt kan uitlezen.

De Eastron sdm120m kWh meter beschikt over een RS485 Modbus aansluiting. Van een standaard RJ-45 kabel heb ik een stekkertje afgeknipt en de draadjes gestript en aangesloten op de aansluitingen 8 t/m 10. De andere RJ-45 stekker heb ik vervolgens in de vrije RS485 poort van m’n Delta Solivia 3.0 omvormer gestopt en zo de RS485 bus uitgebreid. Tevens heb ik zowel op de USB-to-serial adapter als op de sdm120m een 120 Ohm weerstandje geplaatst tussen A en B als RS485 modus terminator.

Benodigdheden:

  • 1 RJ-45 kabel
  • Eastron sdm120m kWh meter
Reeds geïnstalleerd en up-and-running:
  • Linux servertje met python 2.x en MQTT-cliënt
  • Node-red
  • MQTT
  • MariaDB (MySQL)
  • Google account

Pinout:

sdm120m

Solivia 3.0

RJ-45 pin – draad sdm120m RJ-45 pin – draad FT232RL
 7 – Bruin/wit A (10) 7 – Bruin/wit TX_A
6 – Groen B (9) 6 – Groen RX_B
4 – Blauw Gnd (8) 4 – Blauw Gnd


Testopstelling:

M.b.v. een Stekker en een stukje tweelingsnoer, en een fitting met een 40w lamp heb ik een testopstelling gemaakt, dus Stekker – kWh meter – 40w lamp

Stekker fase op 1 – L-in, neutraal op 3 – N

Lamp fase op 2 – L-out, neutraal op 4 – N

 

 

RS485 (RJ-45 kabel) aangesloten op Gnd (8), B (9) en A (10) en in vrije RS485 aansluiting van mijn Delta Solivia 3.0 omvormer gestopt, en hiermee de RS485 bus uitgebreid met een extra device. Vanwege dit extra device heb ik zowel op de FT232RL USB to Serial adapter als op de SDM120M een 120 Ohm weerstandje geplaatst als “terminator”, gewoon tussen de schroefklemmen samen met het kabeltje op de A en B aansluiting. Dit conform de aanbevelingen van RS485 en bovenstaand schema. Deze terminator zorgt er voor dat er geen “ruis” op de lijn komt door de impedantie van de kabels.

RS485 ID aanpassen:

Default staat de sdm120m ingesteld op RS485 ID: 1. Aangezien ik dit ID al in gebruik heb voor één van mijn omvormers heb ik het ID aangepast. Dit doe je als volgt. De kWh meter kun je in setup-mode plaatsen door het knopje 3 seconden ingedrukt te houden, op het LCD-display komt dan Id 001 te staan, door het knopje kort in te drukken verhoog je het ID-nummer, iets langer ingedrukt houden zorgt ervoor dat je op de 2e en 3e positie komt te staan om de 10-tallen of 100-tallen in te stellen. In mijn geval het Id veranderd in 003.

 

Python-script om waarden uit te lezen:

Als basis heb ik het python script sdm120c.py gebruikt welke van Github te downloaden is. Dit gecloned in de map /root/python/eastron met het commando:

git clone https://github.com/gianfrdp/SDM120C.git

Aangezien de sdm120c hetzelfde RTU-protocol gebruikt als de sdm120m, kun je dit script in principe ongewijzigd toepassen. Omdat ik de waarden via MQTT wil transporteren heb ik echter de output aangepast naar een valide JSON-bericht. Ook heb ik het script geschikt gemaakt voor Python3 met de tool 2to3. Het aangepaste script ziet er als volgt uit:

#!/usr/bin/python

import minimalmodbus
import datetime
import random
import time

rs485 = minimalmodbus.Instrument(‘/dev/ttyUSB0’, 3)
rs485.serial.baudrate = 2400
rs485.serial.bytesize = 8
rs485.serial.parity = minimalmodbus.serial.PARITY_NONE
rs485.serial.stopbits = 1
rs485.serial.timeout = 1
rs485.debug = False
rs485.close_port_after_each_call = False
rs485.mode = minimalmodbus.MODE_RTU
# print rs485
pauze=0.5

Volts = rs485.read_float(0, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Current = rs485.read_float(6, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Active_Power = rs485.read_float(12, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Apparent_Power = rs485.read_float(18, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Reactive_Power = rs485.read_float(24, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Power_Factor = rs485.read_float(30, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Phase_Angle = rs485.read_float(36, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Frequency = rs485.read_float(70, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Import_Active_Energy = rs485.read_float(72, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Export_Active_Energy = rs485.read_float(74, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Import_Reactive_Energy = rs485.read_float(76, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Export_Reactive_Energy = rs485.read_float(78, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Total_Active_Energy = rs485.read_float(342, functioncode=4, numberOfRegisters=2)
time.sleep(pauze)
Total_Reactive_Energy = rs485.read_float(344, functioncode=4, numberOfRegisters=2)

# Volts = random.uniform(220, 240)
# Current = random.uniform(20, 25)
# Active_Power = random.uniform(1, 2)
# Apparent_Power = random.uniform(1, 2)
# Reactive_Power = random.uniform(1, 2)
# Power_Factor = random.uniform(0, 2)
# Phase_Angle = random.uniform(0, 90)
# Frequency = random.uniform(50, 60)
# Import_Active_Energy = 0
# Export_Active_Energy = random.uniform(1, 2)
# Import_Reactive_Energy = 0
# Export_Reactive_Energy = 0
# Total_Active_Energy = random.uniform(500, 1000)
# Total_Reactive_Energy = 0

print(‘{‘)
print((‘ “Datetime”: “‘), end=’ ‘)
print((datetime.datetime.now()), end=’ ‘)
print(‘”,’)
print(‘ “Voltage”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Volts))
print(‘ “Unit”: “Volts”‘)
print(‘ },’)
print(‘ “Current”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Current))
print(‘ “Unit”: “Amps”‘)
print(‘ },’)
print(‘ “Active power”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Active_Power))
print(‘ “Unit”: “Watts”‘)
print(‘ },’)
print(‘ “Apparent power”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Apparent_Power))
print(‘ “Unit”: “VoltAmps”‘)
print(‘ },’)
print(‘ “Reactive power”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Reactive_Power))
print(‘ “Unit”: “VAr”‘)
print(‘ },’)
print(‘ “Power factor”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Power_Factor))
print(‘ “Unit”: “”‘)
print(‘ },’)
print(‘ “Phase angle”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Phase_Angle))
print(‘ “Unit”: “Degree”‘)
print(‘ },’)
print(‘ “Frequency”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Frequency))
print(‘ “Unit”: “Hz”‘)
print(‘ },’)
print(‘ “Import active energy”: {‘)
print(‘ “Value”: “{0:.3f}”,’ .format(Import_Active_Energy))
print(‘ “Unit”: “Kwh”‘)
print(‘ },’)
print(‘ “Export active energy”: {‘)
print(‘ “Value”: “{0:.3f}”,’ .format(Export_Active_Energy))
print(‘ “Unit”: “Kwh”‘)
print(‘ },’)
print(‘ “Import reactive energy”: {‘)
print(‘ “Value”: “{0:.3f}”,’ .format(Import_Reactive_Energy))
print(‘ “Unit”: “Kwh”‘)
print(‘ },’)
print(‘ “Export reactive energy”: {‘)
print(‘ “Value”: “{0:.3f}”,’ .format(Export_Reactive_Energy))
print(‘ “Unit”: “Kwh”‘)
print(‘ },’)
print(‘ “Total active energy”: {‘)
print(‘ “Value”: “{0:.3f}”,’ .format(Total_Active_Energy))
print(‘ “Unit”: “Kwh”‘)
print(‘ },’)
print(‘ “Total reactive energy”: {‘)
print(‘ “Value”: “{0:.3f}”,’ .format(Total_Reactive_Energy))
print(‘ “Unit”: “Kwh”‘)
print(‘ },’)
print(‘ “Current Yield (V*A)”: {‘)
print(‘ “Value”: “{0:.1f}”,’ .format(Volts * Current))
print(‘ “Unit”: “Watt”‘)
print(‘ }’)
print(‘}’)

Het script kun je ook hier downloaden.

Python bibliotheken geïnstalleerd:

Het script (zie import statements) is afhankelijk van de python bibliotheek minimalmodbus welke op zijn beurt weer afhankelijk is van de bibliotheek pyserial. Installatie als volgt:

pip3 install minimalmodbus==0.7

pip3 install pyserial

Connectietest:

Nu zijn we 3klaar voor een eerste test. Vul in het script de juiste waarden in voor de USB poort, RS485 ID, baudrate etc.

rs485 = minimalmodbus.Instrument(‘/dev/ttyUSB0’, 3)
rs485.serial.baudrate = 2400
rs485.serial.bytesize = 8
rs485.serial.parity = minimalmodbus.serial.PARITY_NONE
rs485.serial.stopbits = 1


De default baudrate, bytesize, parity en stopbits van de sdm120m zijn: 2400, 8, N, 1, ook die zijn aan te passen, maar is gezien de geringe hoeveelheid data die over de lijn gaat niet echt nodig.

En de 1e test voer je uit met:

python3 sdm120m.py

Als alles goed is, dan geeft dit de volgende output:


{
“Datetime”: ” 2021-04-01 22:03:10.339148 “,
“Voltage”: {
“Value”: “228.3”,
“Unit”: “Volts”
},
“Current”: {
“Value”: “0.0”,
“Unit”: “Amps”
},
“Active power”: {
“Value”: “0.0”,
“Unit”: “Watts”
},
“Apparent power”: {
“Value”: “0.0”,
“Unit”: “VoltAmps”
},
“Reactive power”: {
“Value”: “0.0”,
“Unit”: “VAr”
},
“Power factor”: {
“Value”: “1.0”,
“Unit”: “”
},
“Phase angle”: {
“Value”: “0.0”,
“Unit”: “Degree”
},
“Frequency”: {
“Value”: “49.9”,
“Unit”: “Hz”
},
“Import active energy”: {
“Value”: “0.045”,
“Unit”: “Kwh”
},
“Export active energy”: {
“Value”: “0.000”,
“Unit”: “Kwh”
},
“Import reactive energy”: {
“Value”: “0.016”,
“Unit”: “Kwh”
},
“Export reactive energy”: {
“Value”: “0.000”,
“Unit”: “Kwh”
},
“Total active energy”: {
“Value”: “0.045”,
“Unit”: “Kwh”
},
“Total reactive energy”: {
“Value”: “0.016”,
“Unit”: “Kwh”
},
“Current Yield (V*A)”: {
“Value”: “0.0”,
“Unit”: “Watt”
}
}

Valide JSON:

Vervolgens heb ik op https://jsonlint.com/ nog even getest of de output een valide JSON-bericht oplevert

Shell-script:

In de volgende stap heb ik een shell-script gemaakt die de output uit het python script via de MQTT-cliënt verstuurd naar de MQTT-broker

#!/bin/bash
export PYTHONIOENCODING=utf8
i=1

# Eastron SDM120M kWhmeter t.b.v. Laadpaal
echo 'Begin:' `date` >> /tmp/eastron.log
message=`python /root/python/eastron/sdm120m.py 2>&1`
while [[ $i -le 10 && `echo $message | grep error | wc -l` -gt 0 ]]
do
  echo 'Retrying' $i '...' >> /tmp/eastron.log
  sleep 10
  message=`python3 /root/python/eastron/sdm120m.py 2>&1`
  i=$(( $i + 1 ))
done
echo $message >> /tmp/eastron.log
if [[ `echo $message | grep error | wc -l` -le 0 ]]
then
  mosquitto_pub -d -h 192.168.2.29 -p 1883 -m "$message" -t eastron/kwhmeter/laadpaal >> /tmp/eastron.log 2>&1
fi
echo 'Eind:' `date` >> /tmp/eastron.log

En zet de juiste execute rechten met:

chmod 744 eastron.sh

Note: De while loop had ik in eerste instantie niet ingebouwd. Maar tijdens een analyse van de data kwam ik er achter dat er soms waarnemingen gemist werden. Verdere analyse van de logfiles leerde me dat het python script soms een fout veroorzaakte. Waarschijnlijk veroorzaakt door de matige kwaliteit van de FTDI usb dongle. Daarom een test ingebouwd op het woord ‘error’ en een while loop toegevoegd die het 10 keer probeert totdat er een valide JSON bericht wordt gegenereerd. Dit bleek een afdoende oplossing voor het probleem.

Shell-script gescheduled:

M.b.v. crontab heb ik de executie van het shell-script gescheduled zodat om het uur de waarden uit de kWh meter uitgelezen worden en als MQTT bericht naar de MQTT broker worden gestuurd. Met crontab -e heb ik onderstaande regel onderaan in de crontab toegevoegd.

0 * * * * /root/python/eastron/eastron.sh

Node-red flow aangemaakt:

Deze Node-red flow leest het JSON-bericht uit de MQTT-queue en slaat de uitgelezen waarden op in een tabel in de MariaDb database.

Node

Doel

Beschrijving

Run once

Initieert bij het starten van de flow dat de laatste opgeslagen waarden uit de database worden gelezen

 

Get last added values

Functie die de sql genereert waarde de laatst opgeslagen waarden uit de database worden gelezen

select * from laadpaal where `sample datetime` = (select max(`sample datetime`) from laadpaal);

Database

Database connectie naar de MariaDB database

Database: energy

Set previous meter readings

Functie die het laatste eindtotaal van de kWh meter en amperage opslaat in flow variabelen

Als mijn elektrische auto opgeladen wordt doet hij dit met 25.3 ampere. Als de amperage verspringt van 0 naar 25.3 is er een nieuwe laadbeurt gestart.

MQTT in

Connectie met de MQTT broker

Topic: eastron/kwhmeter/laadpaal

Build SQL

Functie die op basis van de waarden uit het JSON-bericht een INSERT statement opbouwd

Tevens wordt de delta tussen het huidige ‘Total active energy’ en het vorige ‘Total active energy’ waarde berekend en als fact ‘delta active energy’ toegevoegd aan de tabel. Eveneens wordt het huidige amperage vergeleken met het vorige amperage, als het vorige amperage 0 is en de huidige amperage > 0, dan is er een laadbeurt gestart en wordt de waarde van laadbeurt op1 gezet

Database

Database connectie naar de MariaDB database

Database: energy

Msg.payload

Debugging

 

export

[{"id":"e4989a22.d8a688","type":"tab","label":"Laadpaal","disabled":false,"info":""},{"id":"6b693a4c.4a6064","type":"mqtt in","z":"e4989a22.d8a688","name":"MQTT in","topic":"eastron/kwhmeter/laadpaal","qos":"2","datatype":"json","broker":"ede154bd.f75f38","x":160,"y":160,"wires":[["da077383.a3fb9"]]},{"id":"da077383.a3fb9","type":"function","z":"e4989a22.d8a688","name":"Build SQL","func":"// {\"Datetime\":\" 2021-03-31 11:22:15.489780 \",\"Voltage\":{\"Value\":\"230.2\",\"Unit\":\"Volts\"},\"Current\":{\"Value\":\"22.0\",\"Unit\":\"Amps\"},\"Active power\":{\"Value\":\"120.9\",\"Unit\":\"Watts\"},\"Apparent power\":{\"Value\":\"4.0\",\"Unit\":\"VoltAmps\"},\"Reactive power\":{\"Value\":\"4.0\",\"Unit\":\"VAr\"},\"Power factor\":{\"Value\":\"1.0\",\"Unit\":\"\"},\"Phase angle\":{\"Value\":\"20.3\",\"Unit\":\"Degree\"},\"Frequency\":{\"Value\":\"50.0\",\"Unit\":\"Hz\"},\"Import active energy\":{\"Value\":\"0.000\",\"Unit\":\"Kwh\"},\"Export active energy\":{\"Value\":\"120.300\",\"Unit\":\"Kwh\"},\"Import reactive energy\":{\"Value\":\"0.000\",\"Unit\":\"Kwh\"},\"Export reactive energy\":{\"Value\":\"0.000\",\"Unit\":\"Kwh\"},\"Total active energy\":{\"Value\":\"999.230\",\"Unit\":\"Kwh\"},\"Total reactive energy\":{\"Value\":\"0.000\",\"Unit\":\"Kwh\"},\"Current Yield (V*A)\":{\"Value\":\"5064.4\",\"Unit\":\"Watt\"}}\nvar sql = \"INSERT INTO `energy`.`laadpaal` (`sample datetime`, `Voltage`, `Current`, `Active power`, `Apparent power`, `Reactive power`, `Power factor`, `Phase angle`, `Frequency`, `Import active energy`, `Export active energy`, `Import reactive energy`, `Export reactive energy`, `Total active energy`, `Total reactive energy`, `Current Yield`, `delta active energy`,`laadbeurt` ) \"\nsql = sql + \"values (:sample_datetime, :voltage, :current, :active_power, :apparent_power, :reactive_power, :power_factor, :phase_angle, :frequency, :import_active_energy, :export_active_energy, :import_reactive_energy,:export_reactive_energy, :total_active_energy, :total_reactive_energy, :current_yield, :delta_active_energy, :laadbeurt);\";\n\nmsg.payload.sample_datetime=msg.payload[\"Datetime\"]; \nmsg.payload.voltage=msg.payload[\"Voltage\"].Value;\nmsg.payload.current=msg.payload[\"Current\"].Value;\nmsg.payload.active_power=msg.payload[\"Active power\"].Value;\nmsg.payload.apparent_power=msg.payload[\"Apparent power\"].Value;\nmsg.payload.reactive_power=msg.payload[\"Reactive power\"].Value;\nmsg.payload.power_factor=msg.payload[\"Power factor\"].Value;\nmsg.payload.phase_angle=msg.payload[\"Phase angle\"].Value;\nmsg.payload.frequency=msg.payload[\"Frequency\"].Value;\nmsg.payload.import_active_energy=msg.payload[\"Import active energy\"].Value;\nmsg.payload.export_active_energy=msg.payload[\"Export active energy\"].Value;\nmsg.payload.import_reactive_energy=msg.payload[\"Import reactive energy\"].Value;\nmsg.payload.export_reactive_energy=msg.payload[\"Export reactive energy\"].Value;\nmsg.payload.total_active_energy=msg.payload[\"Total active energy\"].Value;\nmsg.payload.total_reactive_energy=msg.payload[\"Total reactive energy\"].Value;\nmsg.payload.current_yield=msg.payload[\"Current Yield (V*A)\"].Value;\nmsg.payload.delta_active_energy=msg.payload[\"Total active energy\"].Value - flow.get(\"Total_active_energy\");\n\nif (flow.get(\"Current\") === 0 && msg.payload[\"Current\"].Value > 0) {\n msg.payload.laadbeurt = 1;\n} else {\n msg.payload.laadbeurt = 0; \n}\n\nflow.set(\"Total_active_energy\",msg.payload[\"Total active energy\"].Value);\nflow.set(\"Current\",msg.payload[\"Current\"].Value);\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":380,"y":160,"wires":[["63fea956.feb1f8"]]},{"id":"12c8e6e6.e24009","type":"debug","z":"e4989a22.d8a688","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":930,"y":160,"wires":[]},{"id":"63fea956.feb1f8","type":"mysql","z":"e4989a22.d8a688","mydb":"8056d2ce.5f8c8","name":"Database","x":680,"y":160,"wires":[["12c8e6e6.e24009"]]},{"id":"62f2b228.26976c","type":"inject","z":"e4989a22.d8a688","name":"Run once","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":170,"y":80,"wires":[["9da92b39.acb878"]]},{"id":"9da92b39.acb878","type":"function","z":"e4989a22.d8a688","name":"Get last added values","func":"var sql = \"select * from laadpaal where `sample datetime` = (select max(`sample datetime`) from laadpaal);\"\n\nmsg.topic=sql;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":420,"y":80,"wires":[["6d5a5324.96110c"]]},{"id":"6d5a5324.96110c","type":"mysql","z":"e4989a22.d8a688","mydb":"8056d2ce.5f8c8","name":"Database","x":680,"y":80,"wires":[["bdac109b.0075b","12c8e6e6.e24009"]]},{"id":"bdac109b.0075b","type":"function","z":"e4989a22.d8a688","name":"Set previous meter readings","func":"flow.set(\"Total_active_energy\",msg.payload[0][\"Total active energy\"]);\nflow.set(\"Current\",msg.payload[0][\"Current\"]);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":980,"y":80,"wires":[[]]},{"id":"ede154bd.f75f38","type":"mqtt-broker","z":"","name":"pi","broker":"192.168.2.29","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"8056d2ce.5f8c8","type":"MySQLdatabase","z":"","name":"mysql","host":"localhost","port":"3306","db":"energy","tz":"","charset":"UTF8"}]

Tabel ‘Laadpaal’ aangemaakt in MariaDB:

mysql -u root -p

USE energy;

CREATE TABLE `energy`.`laadpaal` (
`sample datetime` DATETIME NOT NULL,
`Voltage` FLOAT NULL,
`Current` FLOAT NULL,
`Active power` FLOAT NULL,
`Apparent power` FLOAT NULL,
`Reactive power` FLOAT NULL,
`Power factor` FLOAT NULL,
`Phase angle` FLOAT NULL,
`Frequency` FLOAT NULL,
`Import active energy` FLOAT NULL,
`Export active energy` FLOAT NULL,
`Import reactive energy` FLOAT NULL,
`Export reactive energy` FLOAT NULL,
`Total active energy` FLOAT NULL,
`Total reactive energy` FLOAT NULL,
`Current Yield` FLOAT NULL,
`delta active energy` FLOAT NULL DEFAULT NULL,
`laadbeurt` INT NULL DEFAULT 0,
PRIMARY KEY (`sample datetime`));

T.b.v. het ophalen van de vorige ‘Total active energy’ waarde, een eerste record toegevoegd met 0-waarden.

INSERT INTO `energy`.`laadpaal` (`sample datetime`, `Voltage`, `Current`, `Active power`, `Apparent power`, `Reactive power`, `Power factor`, `Phase angle`, `Frequency`, `Import active energy`, `Export active energy`, `Import reactive energy`, `Export reactive energy`, `Total active energy`, `Total reactive energy`, `Current Yield`, `delta active energy`, `laadbeurt`) VALUES ('2021-03-31 09:29:36.482869', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');

User googledata select rechten gegeven op deze tabel met:

grant select on energy.laadpaal to 'googledata'@'%';

Energie dashboard op Google data studio uitgebreid:

De dashboard uitgebreid met Laatste update, Actueel verbruik, Totaal verbruik, Aantal laadbeurten per week en Verbruik per weekdag van de laadpaal

  • Login in met je Google account op https://datastudio.google.com/
  • Voor de scoreboard ‘Actueel verbruik’ heb ik de volgende MySQL verbinding gedefinieerd:

select `Active power` as "Active"
from laadpaal
where `sample datetime` = (select max(`sample datetime`)
from laadpaal)

  • Voor de scoreboard ‘Totaal verbruik’ en de staafdiagram ‘Totaal verbruik per dag in kWh’ heb ik de volgende MySQL verbinding gedefinieerd:

SELECT
       `sample datetime` AS 'sample_datetime',
       `Total active energy` AS 'total',
       `delta active energy` AS 'delta'
FROM laadpaal;

  • Voor de lijndiagram ‘Laadbeurten’ heb ik de volgende MySQL verbinding gedefinieerd:

SELECT `sample datetime` as 'sample_datetime',
       laadbeurt
FROM laadpaal;

  • Hieronder screenshots van de configuratie van de verschillende dashboard onderdelen:

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *