Plugwise Smile P1 – Data uitlezen met scripts
Hieronder vind je een aantal scripts om de data uit de PlugWise Smile te halen, dit is een XML dump welke je kan uitlezen en de waarden in een variabele te stoppen.
Info: Plugwise Smile P1 locatie data gegevens.
Firmware 2.0.6x
XML layout [SMILE IP]/core/modules:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
<?xml version="1.0" encoding="UTF-8"?> <modules> <module id='49ffc1e96e6d4cb98de162ddb42a8c4b'> <vendor_name></vendor_name> <vendor_model></vendor_model> <hardware_version></hardware_version> <firmware_version></firmware_version> <created_date>2012-12-07T17:00:00+00:00</created_date> <modified_date>2015-06-27T14:06:17.737+00:00</modified_date> <deleted_date></deleted_date> <services> <gas_interval_meter id='2bf5a1cd4c4a9d818f9fca743c6e'> <measurement log_date='2015-06-27T13:00:00+00:00' unit='m3' interval='PT1H' directionality='consumed'>0.013</measurement> </gas_interval_meter> <gas_cumulative_meter id='a958de700cef3a8f95a8d6385a48'> <measurement log_date='2015-06-27T14:00:00+00:00' unit='m3' directionality='consumed'>1592.185</measurement> </gas_cumulative_meter> </services> <protocols> <dsmrgas id='21b8ada6473746ff8227e3faab7296af'> <serial>81540074212</serial> <dsmrmain id='ea4b50913f6c47b7a1609e0cc9831e61'/> </dsmrgas> </protocols> </module> <module id='a6cd3610e5ba404a81cdc26aa82a65cb'> <vendor_name>Kamstrup</vendor_name> <vendor_model>KMP5 4012</vendor_model> <hardware_version></hardware_version> <firmware_version></firmware_version> <created_date>2012-12-07T17:00:00+00:00</created_date> <modified_date>2015-06-27T14:06:17.737+00:00</modified_date> <deleted_date></deleted_date> <services> <electricity_interval_meter id='bbf69188051486868e52c53a9584'> <measurement log_date='2015-06-27T11:00:00+00:00' unit='Wh' interval='PT300S' directionality='produced' tariff_indicator='nl_offpeak'>0.000</measurement> <measurement log_date='2015-06-27T11:00:00+00:00' unit='Wh' interval='PT300S' directionality='produced' tariff_indicator='nl_peak'>0.000</measurement> <measurement log_date='2015-06-27T11:00:00+00:00' unit='Wh' interval='PT300S' directionality='consumed' tariff_indicator='nl_offpeak'>680.000</measurement> <measurement log_date='2015-06-27T11:00:00+00:00' unit='Wh' interval='PT300S' directionality='consumed' tariff_indicator='nl_peak'>0.000</measurement> </electricity_interval_meter> <electricity_cumulative_meter id='dfce8559d284b786d57385824bde'> <measurement log_date='2015-06-27T12:00:00+00:00' unit='Wh' directionality='produced' tariff_indicator='nl_offpeak'>0.000</measurement> <measurement log_date='2015-06-27T12:00:00+00:00' unit='Wh' directionality='produced' tariff_indicator='nl_peak'>0.000</measurement> <measurement log_date='2015-06-27T12:00:00+00:00' unit='Wh' directionality='consumed' tariff_indicator='nl_offpeak'>6895868.000</measurement> <measurement log_date='2015-06-27T12:00:00+00:00' unit='Wh' directionality='consumed' tariff_indicator='nl_peak'>6471853.000</measurement> </electricity_cumulative_meter> <electricity_point_meter id='0c825f5f7cc4481a00be7dcc86ca'> <measurement log_date='2015-06-27T12:05:44+00:00' unit='W' directionality='produced'>0.000</measurement> <measurement log_date='2015-06-27T12:05:44+00:00' unit='W' directionality='consumed'>550.000</measurement> </electricity_point_meter> </services> <protocols> <dsmrmain id='ea4b50913f6c47b7a1609e0cc9831e61'> <serial> KMP5 4012</serial> <dsmrmbuses> <dsmrgas id='21b8ada6473746ff8227e3faab7296af'/> </dsmrmbuses> </dsmrmain> </protocols> </module> </modules> |
Uitlezen met PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php // Dit is een PHP script voor het weergeven van Plugwise smile P1 gegevens (http://192.168.X.X/core/modules) // 2015-06-27 door Sebastiaan Ebeltjes (Domoticx.nl). // Getest met firmware 2.0.6.X // Zet PHP error report aan. error_reporting(E_ERROR); ini_set('display_errors', 1); // Smile instellingen $SmileIp = "192.168.X.XX"; $SmileId = "SMILEID"; // De 8 letters van de Smile ID // Ophalen van smile data XML bestand $HTTPAuth = stream_context_create(array( 'http' => array( 'header' => "Authorization: Basic " . base64_encode("smile:" . $SmileId) ) )); $SmileData = new SimpleXMLElement(file_get_contents("http://" . $SmileIp . "/core/modules", false, $HTTPAuth)); // Welke meter heeft welk nummer in de XML? for ($teller = 0; $teller <= 1; $teller++) { $TypeG = $SmileData->module[$teller]->services[0]->gas_interval_meter[0]->measurement[0]['unit']; $TypeE = $SmileData->module[$teller]->services[0]->electricity_interval_meter[0]->measurement[0]['unit']; if ($TypeE == "Wh") { $MeterE = $teller; } if ($TypeG == "m3") { $MeterG = $teller; } } // ELEKTRA METERSTANDEN // gedeeld door 1 is een fix voor meterwaarden om de nullen weg te halen. $mEPLTi = $SmileData->module[$MeterE]->services[0]->electricity_interval_meter[0]->measurement[0] / 1; //[0] = directionality="produced" tariff_indicator="nl_offpeak" $mEPHTi = $SmileData->module[$MeterE]->services[0]->electricity_interval_meter[0]->measurement[1] / 1; //[1] = directionality="produced" tariff_indicator="nl_peak" $mECLTi = $SmileData->module[$MeterE]->services[0]->electricity_interval_meter[0]->measurement[2] / 1; //[2] = directionality="consumed" tariff_indicator="nl_offpeak" $mECHTi = $SmileData->module[$MeterE]->services[0]->electricity_interval_meter[0]->measurement[3] / 1; //[3] = directionality="consumed" tariff_indicator="nl_peak" // gedeeld door 1000 is een fix voor meterwaarden, bijvoorbeeld het getal 6896572.000, moet zijn: 6896.572 $mEPLT = $SmileData->module[$MeterE]->services[0]->electricity_cumulative_meter[0]->measurement[0] / 1000; //[0] = directionality="produced" tariff_indicator="nl_offpeak" $mEPHT = $SmileData->module[$MeterE]->services[0]->electricity_cumulative_meter[0]->measurement[1] / 1000; //[1] = directionality="produced" tariff_indicator="nl_peak" $mECLT = $SmileData->module[$MeterE]->services[0]->electricity_cumulative_meter[0]->measurement[2] / 1000; //[2] = directionality="consumed" tariff_indicator="nl_offpeak" $mECHT = $SmileData->module[$MeterE]->services[0]->electricity_cumulative_meter[0]->measurement[3] / 1000; //[3] = directionality="consumed" tariff_indicator="nl_peak" $mEPAT = $SmileData->module[$MeterE]->services[0]->electricity_point_meter[0]->measurement[0]; //[0] = directionality="produced" $mECAV = $SmileData->module[$MeterE]->services[0]->electricity_point_meter[0]->measurement[1]; //[1] = directionality="consumed" // GAS METERSTAND $mG = $SmileData->module[$MeterG]->services[0]->gas_cumulative_meter[0]->measurement[0]; $mGi = $SmileData->module[$MeterG]->services[0]->gas_interval_meter[0]->measurement[0]; echo "Elektra - meterstand verbruik LAAG tarief (W): " . $mECLT . " (verbruik laatste 6 minuten: " . $mECLTi . ")<br>"; echo "Elektra - meterstand verbruik HOOG tarief (W): " . $mECHT . " (verbruik laatste 6 minuten: " . $mECHTi . ")<br>"; echo "Elektra - meterstand teruglevering LAAG tarief (W): " . $mEPLT . " (verbruik laatste 6 minuten: " . $mEPLTi . ")<br>"; echo "Elektra - meterstand teruglevering HOOG tarief (W): " . $mEPHT . " (verbruik laatste 6 minuten: " . $mEPHTi . ")<br>"; echo "Elektra - actueel verbruik (Wh): " . $mECAV . "<br>"; echo "Elektra - actueel teruglevering (Wh): " . $mEPAT . "<br>"; echo "Gas - meterstand (m3): " . $mG . " (verbruik laatste uur: " . $mGi . ")<br>"; ?> |
Resultaat:
1 2 3 4 5 6 7 |
Elektra - meterstand verbruik LAAG tarief (W): 6897.166 (verbruik laatste 6 minuten: 49) Elektra - meterstand verbruik HOOG tarief (W): 6471.853 (verbruik laatste 6 minuten: 0) Elektra - meterstand teruglevering LAAG tarief (W): 0 (verbruik laatste 6 minuten: 0) Elektra - meterstand teruglevering HOOG tarief (W): 0 (verbruik laatste 6 minuten: 0) Elektra - actueel verbruik (Wh): 570.000 Elektra - actueel teruglevering (Wh): 0.000 Gas - meterstand (m3): 1592.185 (verbruik laatste uur: 0.000) |
Firmware 1.1.x en 1.2.x
XML layout [SMILE IP]/smartmeter/modules:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
<?xml version="1.0" encoding="ISO-8859-1"?> <modules> <module id='49ffc1e96e64cb98e162db428c4b'> <cumulative_logs> <cumulative_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>gas_consumed</type> <unit>m3</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:00:00+00:00"> <measurement log_date="2014-05-28T22:00:00+00:00">864.708</measurement> </period> </cumulative_log> </cumulative_logs> <point_logs> </point_logs> </module> <module id='a6cd360e5b404a8cdc26a82a65cb'> <vendor_name>Kamstrup</vendor_name> <vendor_model>KMP5 166074</vendor_model> <cumulative_logs> <cumulative_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>electricity_consumed</type> <unit>Wh</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:35:55+00:00"> <measurement log_date="2014-05-28T22:35:55+00:00" tariff_type="nl_peak">3338457</measurement> </period> </cumulative_log> <cumulative_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>electricity_consumed</type> <unit>Wh</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:35:55+00:00"> <measurement log_date="2014-05-28T22:35:55+00:00" tariff_type="nl_offpeak">3844737</measurement> </period> </cumulative_log> <cumulative_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>electricity_produced</type> <unit>Wh</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:35:55+00:00"> <measurement log_date="2014-05-28T22:35:55+00:00" tariff_type="nl_peak">0</measurement> </period> </cumulative_log> <cumulative_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>electricity_produced</type> <unit>Wh</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:35:55+00:00"> <measurement log_date="2014-05-28T22:35:55+00:00" tariff_type="nl_offpeak">0</measurement> </period> </cumulative_log> </cumulative_logs> <point_logs> <point_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>electricity_consumed</type> <unit>W</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:35:55+00:00"> <measurement log_date="2014-05-28T22:35:55+00:00">790</measurement> </period> </point_log> <point_log> <last_consecutive_log_date>2014-05-28T22:30:00+00:00</last_consecutive_log_date> <type>electricity_produced</type> <unit>W</unit> <period start_date="2012-12-07T17:00:00+00:00" end_date="2014-05-28T22:35:55+00:00"> <measurement log_date="2014-05-28T22:35:55+00:00">0</measurement> </period> </point_log> </point_logs> </module> </modules> |
Uitlezen met PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?php // Dit is een PHP script voor het weergeven van Plugwise Smile P1 gegevens (http://192.168.X.X/smartmeter/modules) // Getest met Smile P1 firmware v1.2.x // 2014-04-15 door Sebastiaan Ebeltjes. // Zet PHP error meldingen aan (zo kunnen eenvoudig fouten opgespoord worden. error_reporting(E_ERROR); ini_set('display_errors', 1); // Smile instellingen. $SmileIp = "192.168.x.x"; // Ophalen van Smile P1 data XML bestand. $SmileData = new SimpleXMLElement(file_get_contents("http://" . $SmileIp . "/smartmeter/modules")); // Welke meter heeft welk nummer in de XML? for ($ModuleCount = 0; $ModuleCount <= 1; $ModuleCount++) { $Type = $SmileData->module[$ModuleCount]->cumulative_logs[0]->cumulative_log[0]->type[0]; if ($Type == "electricity_consumed") { $MeterE = $ModuleCount; } if ($Type == "gas_consumed") { $MeterG = $ModuleCount; } } // ELEKTRA METERSTANDEN (cumulative_log) $mEVHT = $SmileData->module[$MeterE]->cumulative_logs[0]->cumulative_log[0]->period[0]->measurement[0]; //[0] = electricity_consumed HOOG $mEVLT = $SmileData->module[$MeterE]->cumulative_logs[0]->cumulative_log[1]->period[0]->measurement[0]; //[1] = electricity_consumed LAAG $mETHT = $SmileData->module[$MeterE]->cumulative_logs[0]->cumulative_log[2]->period[0]->measurement[0]; //[2] = electricity_produced HOOG $mETLT = $SmileData->module[$MeterE]->cumulative_logs[0]->cumulative_log[3]->period[0]->measurement[0]; //[3] = electricity_produced LAAG // ELEKTRA VERBRUIK/TERUGLEVERING (point_logs) $mEAV = $SmileData->module[$MeterE]->point_logs->point_log[0]->period[0]->measurement[0]; //[0] = electricity_consumed HUIDIG $mEAT = $SmileData->module[$MeterE]->point_logs->point_log[1]->period[0]->measurement[0]; //[1] = electricity_produced HUIDIG // GAS METERSTAND (cumulative_log) $mG = $SmileData->module[$MeterG]->cumulative_logs[0]->cumulative_log[0]->period[0]->measurement[0]; // Toon de gegevens. echo "Elektra - meterstand verbruik LAAG tarief (W): " . $mEVLT . "<br>"; echo "Elektra - meterstand verbruik HOOG tarief (W): " . $mEVHT . "<br>"; echo "Elektra - meterstand teruglevering LAAG tarief (W): " . $mETLT . "<br>"; echo "Elektra - meterstand teruglevering HOOG tarief (W): " . $mETHT . "<br>"; echo "Elektra - actueel verbruik (Wh): " . $mEAV . "<br>"; echo "Elektra - actueel teruglevering (Wh): " . $mEAT . "<br>"; echo "Gas - meterstand (m3): " . $mG . "<br>"; ?> |
Resultaat:
1 2 3 4 5 6 7 |
Elektra - meterstand verbruik LAAG tarief (W): 5322868 Elektra - meterstand verbruik HOOG tarief (W): 4916945 Elektra - meterstand teruglevering LAAG tarief (W): 0 Elektra - meterstand teruglevering HOOG tarief (W): 0 Elektra - actueel verbruik (Wh): 1240 Elektra - actueel teruglevering (Wh): 0 Gas - meterstand (m3): 1073.42 |
Uitlezen met Java
Wat heb je nodig?
1) jQuery
Heb je bijvoorbeeld een webserver (poort 80) dan kun je dus niet met portforwarding via je router de smile doorzetten omdat deze ook op poort 80 functioneert. Wel kun je dus via je webserver gegevens uit de smile lezen en deze via de browser laten zien (om maar iets te noemen).
Probleem met Javascript! (Java CORS)
Javascript wordt op de client (gebruiker) uitgevoerd, daarom is javascript tegenwoordig aan strikte policies verbonden: “same-origin policy”, zo mag Javascript geen informatie ophalen van externe bronnen tenzij dat op die server zelf is aangegeven dat het mag, in die zin heet dat “cross-origin resource sharing” oftewel CORS.
Dit is als je javascript gebruikt uiteraard een probleem om gegevens van een externe bron af te halen, en je niet altijd even de header kan aanpassen op de server.
Het is uiteraard een probleem om gegevens van de smile af te halen omdat deze als “externe bron” wordt gezien en je op de smile niet even de header kan aanpassen (CORS) in Nginx (webserver op de smile). er zijn truucjes voor!, in dit geval heb ik een PHP script geschreven om gegevens via javascript uit een externe bron te halen, daarom is dit script ook bedoelt om op een webserver te draaien.
Dit is de HTML pagina waar onder andere de javascripts worden geladen: index.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<html> <head> <script src="jquery.js"></script> <title>Plugwise Smile</title> </head> <body> Bezig met het ophalen van de gegevens (Smile)...<br> Ps. gebeurt er niets?, het uitvoeren van Javascript & PHP is een vereiste!, staan deze aan? <script src="smiledata.js"></script> </body> </html> |
En dit is het PHP bestand download.php waarmee we de XML dump van de smile afhalen:
1 2 3 4 5 |
<?php // Dit is een script voor het downloaden van bestanden voor Java (CORS policy) // 2013-03-04, Sebastiaan Ebeltjes (Phoenix Interactive) file_put_contents($_GET['filename'], file_get_contents($_GET['url'])); ?> |
Nu heb ik de javascript code gebruikt uit de smile, deze gebruikt de jQuery bibliotheek om een XML bestand te parsen, dus die moet je downloaden (niet de 1.9.x versie), samen met wat eigen inbreng van mijzelf is dit het javascript smiledata.js geworden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
$(document).ready(function(){ // dit is een script voor het weergeven van de smilegegevens (modules/xml) // 2013-03-04, Sebastiaan Ebeltjes // Variabele voor het IP van de Plugwise Smile (zelf aanpassen) var smileip = '192.168.x.x'; var fileurl = 'http://' + smileip + '/smartmeter/modules'; var filename = 'modules.xml'; // Voer het bestand 'download.php' uit en wacht totdat het klaar is met downloaden (jQuery/Ajax). $.ajax({ async: false, type: 'GET', url: 'download.php?url=' + fileurl + '&filename='+ filename, success: function(data) {} }); // Lees het XML bestand 'modules.xml' in, en zoek naar de gegevens (jQuery/Ajax). $.ajax({ type: "GET", url: "modules.xml", dataType: "xml", success: function(xml) { $(xml).find('module').each(function() { var type = $(this).find('type').text(); if(type != 'gas_consumed') { $(this).find('cumulative_log').each(function() { var type = $(this).find('type').text(); if(type == 'electricity_consumed') { if($(this).find('measurement').attr('tariff_type') == 'nl_offpeak') { mEVLT = Number($(this).find('measurement').text()); } else if($(this).find('measurement').attr('tariff_type') == 'nl_peak') { mEVHT = Number($(this).find('measurement').text()); } } else if(type == 'electricity_produced') { if($(this).find('measurement').attr('tariff_type') == 'nl_offpeak') { mETLT = Number($(this).find('measurement').text()); } else if($(this).find('measurement').attr('tariff_type') == 'nl_peak') { mETHT = Number($(this).find('measurement').text()); } } }); } else if(type == 'gas_consumed') { $(xml).find('cumulative_log').each(function(){ var type = $(this).find('type').text(); if(type == 'gas_consumed') { mG = $(this).find('measurement').text(); } }); } }); $(xml).find('point_log').each(function(){ var type = $(this).find('type').text(); if(type == 'electricity_consumed') { mEAV = Number($(this).find('measurement').text()); } else if(type == 'electricity_produced') { mEAT = Number($(this).find('measurement').text()); } }); // Schrijf gegevens naar HTML uitvoer. document.write("<pre>"); document.write("Elektra - meterstand verbruik LAAG tarief (W): " + mEVLT + "<br>"); document.write("Elektra - meterstand verbruik HOOG tarief (W): " + mEVHT + "<br>"); document.write("Elektra - actueel verbruik (Wh): " + mEAV + "<br><br>"); document.write("Elektra - meterstand teruglevering LAAG tarief (W): " + mETLT + "<br>"); document.write("Elektra - meterstand teruglevering HOOG tarief (W): " + mETHT + "<br>"); document.write("Elektra - actueel teruglevering (Wh): " + mEAT + "<br><br>"); document.write("Gas - meterstand (m3): " + mG +" <br>"); document.write("</pre>"); } }); }); |
Zet alle bestanden inclusief de jQuery bibliotheek in een folder op je webserver, als je dan je IP adres intikt dan worden de javascripts uitgevoerd en worden er gegevens uit de smile gelezen (kan even duren) en weergegeven op de pagina, dit ziet er ongeveer zo uit:
1 2 3 4 5 6 7 |
Elektra - meterstand verbruik LAAG tarief (W): 5322868 Elektra - meterstand verbruik HOOG tarief (W): 4916945 Elektra - meterstand teruglevering LAAG tarief (W): 0 Elektra - meterstand teruglevering HOOG tarief (W): 0 Elektra - actueel verbruik (Wh): 1240 Elektra - actueel teruglevering (Wh): 0 Gas - meterstand (m3): 1073.42 |
[#/scripts/plugwise_smile_p1_javascript” ]