From 8468ab4199e28196a5eaba33a0c3b5c8284a2bff Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Mon, 2 May 2016 19:52:28 +0200 Subject: [PATCH 01/13] Energy supplier prices does not indicate tariff type (Django admin) #126 --- docs/changelog.rst | 5 ++++ .../migrations/0002_verbose_text.py | 24 ++++++++++++++++++ dsmr_consumption/models/energysupplier.py | 4 +-- .../templates/dsmr_frontend/statistics.html | 4 ++- dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 25773 -> 25738 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 24 +++++++++++------- 7 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 dsmr_consumption/migrations/0002_verbose_text.py diff --git a/docs/changelog.rst b/docs/changelog.rst index 5eac3db4e..ac5d0c1a0 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,6 +2,11 @@ Changelog ========= +v1.2.0 - 2016-xx-xx +^^^^^^^^^^^^^^^^^^^ +- Energy supplier prices does not indicate tariff type (Django admin) (`#126 `_). + + v1.1.2 - 2016-05-01 ^^^^^^^^^^^^^^^^^^^ - Trends page giving errors (when lacking data) (`#125 `_). diff --git a/dsmr_consumption/migrations/0002_verbose_text.py b/dsmr_consumption/migrations/0002_verbose_text.py new file mode 100644 index 000000000..5882d7fac --- /dev/null +++ b/dsmr_consumption/migrations/0002_verbose_text.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dsmr_consumption', '0001_squashed_0004_recalculate_gas_consumption'), + ] + + operations = [ + migrations.AlterField( + model_name='energysupplierprice', + name='electricity_1_price', + field=models.DecimalField(verbose_name='Electricity 1 price (low tariff)', default=0, max_digits=11, decimal_places=5), + ), + migrations.AlterField( + model_name='energysupplierprice', + name='electricity_2_price', + field=models.DecimalField(verbose_name='Electricity 2 price (high tariff)', default=0, max_digits=11, decimal_places=5), + ), + ] diff --git a/dsmr_consumption/models/energysupplier.py b/dsmr_consumption/models/energysupplier.py index 8b2137a53..c70851572 100644 --- a/dsmr_consumption/models/energysupplier.py +++ b/dsmr_consumption/models/energysupplier.py @@ -31,10 +31,10 @@ class EnergySupplierPrice(models.Model): help_text=_('For your own reference, i.e. the name of your supplier') ) electricity_1_price = models.DecimalField( - max_digits=11, decimal_places=5, default=0, verbose_name=_('Electricity 1 price') + max_digits=11, decimal_places=5, default=0, verbose_name=_('Electricity 1 price (low tariff)') ) electricity_2_price = models.DecimalField( - max_digits=11, decimal_places=5, default=0, verbose_name=_('Electricity 2 price') + max_digits=11, decimal_places=5, default=0, verbose_name=_('Electricity 2 price (high tariff)') ) gas_price = models.DecimalField( max_digits=11, decimal_places=5, default=0, verbose_name=_('Gas price') diff --git a/dsmr_frontend/templates/dsmr_frontend/statistics.html b/dsmr_frontend/templates/dsmr_frontend/statistics.html index 3a912919a..3ed67e656 100644 --- a/dsmr_frontend/templates/dsmr_frontend/statistics.html +++ b/dsmr_frontend/templates/dsmr_frontend/statistics.html @@ -149,7 +149,9 @@ {% else %} {% endif %} diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index f40fedde6..e4d8887b7 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 1, 2, 'final', 0) +VERSION = (1, 2, 0, 'beta', 1) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index 8f69edaa565dc6c31d0e4de30c919fda1652db6e..a306d3c93797283cf9ad7d95906cf1ba5874dc39 100644 GIT binary patch delta 4980 zcmYk=32;@_9mnyL1+tJmd07ZqAZ#Iogb)%SECI6+NFoq+2nbq9SX!V!p+TN73~{*77t?pUd05whnh%moH6Y&8hz;B^dX^&{V^Sjkh*38(wA9>8qikM40oU!`Ur#Z zsFOdBZOC6i{>*)TJOgDk8ek0iVrLwSX_EfU3KG?L7FkvEM7%MfI02QfMm6k4HMrJs z6KVyvqB>|m)jNQH#LrL@t72cnaXu=)61B3wN4IABClWrm+quzz8fhcyfsauQpFnNF z1=PSEU@P=veRV$=nS+T#tz0%HV<~pTIjAk(fQ-#FB(VOfc#;C`$t@g?L5cPu8jtF5 z7Iwksu`|Afn$dC8z?)Gkb``Zkk5B{jPO`Tw7PW;LsQbC70T(2>If*1jP@uisggN*I zW@8g-uOpJ}hT>5jW}#Ln2Q`5_)Jj!2R^kZqGq4ojLDg@?EY)!!reU<3gc=xvB{&gR z;_J8+Q#;tcfh>+mVf{McVAOzTpjKodGHLTN>MXp6>gX_Pf~Rp9CbAF8SEKUoT_m)0 zk5Pvyh}QMGC7=e>5ohBs@mV~NzBq(lTVXMF!!qR0Eas;RzKVnJprap!bYY6IKhCyw zn{6a|Q*aHnH|@IG9i*a`z6UaSlj}GUnT&Z3Ie%s|mf=41$DmaE^>v{p)B|-E2BB7Z z3~D9kV3gkfwIq@$cn#TZ(}>!eX7s~grl*;@Fc9OhHFn0)n2tI#E3gFL#i8g!BX_VA zwH1B4+lRRjRc|8RaeJ}XB(_qpzK1>H+zghR{7?+Uy;zJNqUr@^+J|Z<>Mi&IHNeoG z#zdkEqcIhAM)I*5%Tb@^cTf{Jf^Kzil7wEfCM?H?7>;@`OU$kkcy{|#7%=4(F zUG4Y^s^fapcjX9b$*(v*MtvWmdfDw|^kV%r;t~q9CzYrVLk;RQzl7?z!SMvD!&^>X z?`Sglwy1{lQ1!>6&dgj?dzN$muc!eYMh&nzoBh`aTPV!{QG6>0!2sP=;CH4>9h1Mh|PI2fbx8w}L@ zADnNGC>8^_k%PQxCLcBPxfq2DPyMDPorisALrl_{1slu8XPyo?%;D&{oAOSwxBu;Vq;~jV@K3hWuoUh;FOo+ z+mug4w?-CFU>~ALRKwj-OPq&Vsv`8kN~e4p>Vq>IHKX|$gf*!8t5GZVDyp4&)Brv} z9p0m;!+W!U^;dxpC#D-FVJZ&8cDMjlalMn@j$_Gxf_g5A6DIR8562D;``bf2cs$sMLjSEM`0Ce2JhieJcO|rK}IW(hMI9UYNbjX z%TQ-xB>H1DYK!LMBwXeuF_XkO)Psd3_L7yL-q+EnhF4<+*5Zr!0N3EEVfMcl!iL)u z*@!(T--UYa3rxpH*a1^Y?JX`st+0Cx3C(c6;{hxuA6sTS1B1vnpbp!9^utp)5u0!d z_Tiyl<4dUfZJxAe9Elm^+hIp6#r8N4nS`d=BKb{I zSbsIR*QszEBgkJvjqp3vz(S_l4R$~^)W`8jRJ~_WGp%vTUqlUHyHnnXn!q`y{A)}i zALxF{?ywuGp#i84MmhOv)PR;buE#|3ucPYkN7X-rs&@}HA@6DS0NSGJWugXHh`K)o zwPh0)If)IJNx|F5x58Y)-(cEw{&9j^Q2&ph{Av5Nk9@}7<8i1D*E6WYScO`#MOH~z zS~_pId4c$VxJGPiTh~GM8XE5JMe~c}}Tqm!6_}=Oro)UM3R2A_PQ9%5G(Dk)7FFbz015$g4 zohsrwMregD5o3v$30-)B?Vk}a^6;RRJ`jhxpP0)w-ZOK za92veJu)+hQ`P`iir2T+G*^;WdEIi?T|aAkLR)KT!phdkU8|~RR9QO{Ty?>T`B8P# zv$psL_D;{tO77XWUv`!inwR*$Y|pyfyvqR_3Vp2`1#wp2!nM}A!i2gn3vWi(HBbK3 F@4szpQosNJ delta 5084 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 diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index 7f3b78949..1734b5248 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-18 20:05+0200\n" -"PO-Revision-Date: 2016-04-18 19:57+0100\n" +"POT-Creation-Date: 2016-05-02 19:42+0200\n" +"PO-Revision-Date: 2016-05-02 19:41+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -120,11 +120,11 @@ msgstr "Omschrijving" msgid "For your own reference, i.e. the name of your supplier" msgstr "Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" -msgid "Electricity 1 price" -msgstr "Elektriciteitstarief 1 (laag)" +msgid "Electricity 1 price (low tariff)" +msgstr "Elektriciteit 1 (daltarief)" -msgid "Electricity 2 price" -msgstr "Elektriciteitstarief 2 (piek)" +msgid "Electricity 2 price (high tariff)" +msgstr "Elektriciteit 2 (piektarief)" msgid "Gas price" msgstr "Gasprijs" @@ -513,9 +513,6 @@ msgstr "DSMR-reader" msgid "Current version" msgstr "Huidige versie" -msgid "View current release" -msgstr "Bekijk huidige versie" - msgid "Changelog" msgstr "Wijzigingenoverzicht" @@ -796,6 +793,15 @@ msgstr "Nederlands" msgid "English" msgstr "Engels" +#~ msgid "Electricity 1 price" +#~ msgstr "Elektriciteitstarief 1 (laag)" + +#~ msgid "Electricity 2 price" +#~ msgstr "Elektriciteitstarief 2 (piek)" + +#~ msgid "View current release" +#~ msgstr "Bekijk huidige versie" + #~ msgid "Deploy" #~ msgstr "Uitrollen" From cf94a2af99b9d35368354a711fb1a46e1f6d9bb0 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Mon, 2 May 2016 20:03:06 +0200 Subject: [PATCH 02/13] Requirements update #128 --- docs/changelog.rst | 1 + dsmrreader/__init__.py | 2 +- dsmrreader/provisioning/requirements/base.txt | 6 +++--- dsmrreader/provisioning/requirements/dev.txt | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index ac5d0c1a0..f2733c459 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog v1.2.0 - 2016-xx-xx ^^^^^^^^^^^^^^^^^^^ - Energy supplier prices does not indicate tariff type (Django admin) (`#126 `_). +- Requirements update (`#128 `_). v1.1.2 - 2016-05-01 diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index e4d8887b7..910eff1ce 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 1) +VERSION = (1, 2, 0, 'beta', 2) __version__ = get_version(VERSION) diff --git a/dsmrreader/provisioning/requirements/base.txt b/dsmrreader/provisioning/requirements/base.txt index 4008191f8..aee83365d 100644 --- a/dsmrreader/provisioning/requirements/base.txt +++ b/dsmrreader/provisioning/requirements/base.txt @@ -1,8 +1,8 @@ Django==1.8.12 django-flat-theme==1.1.3 django-solo==1.1.2 -dropbox==6.1 +dropbox==6.2 gunicorn==19.4.5 pyserial==3.0.1 -python-dateutil==2.5.2 -pytz==2016.3 \ No newline at end of file +python-dateutil==2.5.3 +pytz==2016.4 \ No newline at end of file diff --git a/dsmrreader/provisioning/requirements/dev.txt b/dsmrreader/provisioning/requirements/dev.txt index 9b618d895..3421d81cf 100644 --- a/dsmrreader/provisioning/requirements/dev.txt +++ b/dsmrreader/provisioning/requirements/dev.txt @@ -1,4 +1,4 @@ -Sphinx==1.4 +Sphinx==1.4.1 sphinx-autobuild==0.6.0 sphinx-intl==0.9.9 sphinx-rtd-theme==0.1.9 \ No newline at end of file From 7d7c0eed0fb8d7326dc9bba041550666b6617ba4 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Mon, 2 May 2016 23:33:52 +0200 Subject: [PATCH 03/13] Force backup #123 --- docs/changelog.rst | 1 + .../dsmr_frontend/configuration.html | 11 +++- dsmr_frontend/tests/test_webinterface.py | 47 +++++++++++++++--- dsmr_frontend/urls.py | 7 ++- dsmr_frontend/views/configuration.py | 15 +++++- dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 25738 -> 26022 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 10 +++- 8 files changed, 81 insertions(+), 12 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index f2733c459..7a70e01d1 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -6,6 +6,7 @@ v1.2.0 - 2016-xx-xx ^^^^^^^^^^^^^^^^^^^ - Energy supplier prices does not indicate tariff type (Django admin) (`#126 `_). - Requirements update (`#128 `_). +- Force backup (`#123 `_). v1.1.2 - 2016-05-01 diff --git a/dsmr_frontend/templates/dsmr_frontend/configuration.html b/dsmr_frontend/templates/dsmr_frontend/configuration.html index 03dc9e9fe..a8c097603 100644 --- a/dsmr_frontend/templates/dsmr_frontend/configuration.html +++ b/dsmr_frontend/templates/dsmr_frontend/configuration.html @@ -91,7 +91,16 @@ {% model_meta_info backup_settings 'latest_backup' 'verbose_name' %} - {{ backup_settings.latest_backup|naturaltime|default_if_none:'-' }} + +

{{ backup_settings.latest_backup|naturaltime|default_if_none:'-' }}

+ +
+ {% csrf_token %} + +
+ {% model_meta_info backup_settings 'latest_backup' 'help_text' %} diff --git a/dsmr_frontend/tests/test_webinterface.py b/dsmr_frontend/tests/test_webinterface.py index 918b0b32a..a06e25ad9 100644 --- a/dsmr_frontend/tests/test_webinterface.py +++ b/dsmr_frontend/tests/test_webinterface.py @@ -8,6 +8,7 @@ from django.contrib.auth.models import User from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption +from dsmr_backup.models.settings import BackupSettings from dsmr_consumption.models.settings import ConsumptionSettings from dsmr_datalogger.models.settings import DataloggerSettings from dsmr_frontend.models.settings import FrontendSettings @@ -275,21 +276,21 @@ def test_export_as_csv(self): @mock.patch('django.utils.timezone.now') def test_configuration(self, now_mock): + view_url = reverse('{}:configuration'.format(self.namespace)) now_mock.return_value = timezone.make_aware( timezone.datetime(2016, 1, 1) ) # Check login required. - response = self.client.get( - reverse('{}:configuration'.format(self.namespace)) - ) + response = self.client.get(view_url) self.assertEqual(response.status_code, 302) + self.assertEqual( + response['Location'], 'http://testserver/admin/login/?next={}'.format(view_url) + ) # Login and retest self.client.login(username='testuser', password='passwd') - response = self.client.get( - reverse('{}:configuration'.format(self.namespace)) - ) + response = self.client.get(view_url) self.assertEqual(response.status_code, 200) self.assertIn('consumption_settings', response.context) @@ -304,6 +305,40 @@ def test_configuration(self, now_mock): self.assertIn('weather_settings', response.context) self.assertIsInstance(response.context['weather_settings'], WeatherSettings) + @mock.patch('django.utils.timezone.now') + def test_configuration_force_backup(self, now_mock): + view_url = reverse('{}:configuration-force-backup'.format(self.namespace)) + now_mock.return_value = timezone.make_aware( + timezone.datetime(2016, 1, 1) + ) + backup_settings = BackupSettings.get_solo() + backup_settings.latest_backup = now_mock.return_value + backup_settings.save() + + self.assertEqual(BackupSettings.get_solo().latest_backup, now_mock.return_value) + + # Check login required. + response = self.client.post(view_url) + self.assertEqual(response.status_code, 302) + self.assertEqual( + response['Location'], 'http://testserver/configuration/admin/login/?next={}'.format(view_url) + ) + + # Login and retest. + self.client.login(username='testuser', password='passwd') + response = self.client.post(view_url) + + success_url = reverse('{}:configuration'.format(self.namespace)) + self.assertEqual(response.status_code, 302) + self.assertEqual( + response['Location'], 'http://testserver{}'.format(success_url) + ) + # Setting should have been altered. + self.assertEqual( + BackupSettings.get_solo().latest_backup, + now_mock.return_value - timezone.timedelta(days=7) + ) + class TestViewsWithoutData(TestViews): """ Same tests as above, but without any data as it's flushed in setUp(). """ diff --git a/dsmr_frontend/urls.py b/dsmr_frontend/urls.py index 36c72ab14..77255ef6d 100644 --- a/dsmr_frontend/urls.py +++ b/dsmr_frontend/urls.py @@ -10,7 +10,7 @@ from dsmr_frontend.views.compare import Compare from dsmr_frontend.views.export import Export, ExportAsCsv from dsmr_frontend.views.status import Status -from dsmr_frontend.views.configuration import Configuration +from dsmr_frontend.views.configuration import Configuration, ForceBackup urlpatterns = [ @@ -43,4 +43,9 @@ url(r'^export/csv$', login_required(ExportAsCsv.as_view()), name='export-as-csv'), url(r'^configuration$', login_required(Configuration.as_view()), name='configuration'), + url( + r'^configuration/force-backup$', + login_required(ForceBackup.as_view()), + name='configuration-force-backup' + ), ] diff --git a/dsmr_frontend/views/configuration.py b/dsmr_frontend/views/configuration.py index 34d9b93dd..07e84ef40 100644 --- a/dsmr_frontend/views/configuration.py +++ b/dsmr_frontend/views/configuration.py @@ -1,4 +1,7 @@ -from django.views.generic.base import TemplateView +from django.views.generic.base import TemplateView, View +from django.core.urlresolvers import reverse +from django.shortcuts import redirect +from django.utils import timezone from dsmr_consumption.models.settings import ConsumptionSettings from dsmr_datalogger.models.settings import DataloggerSettings @@ -19,3 +22,13 @@ def get_context_data(self, **kwargs): context_data['backup_settings'] = BackupSettings.get_solo() context_data['dropbox_settings'] = DropboxSettings.get_solo() return context_data + + +class ForceBackup(View): + """ Alters the backup settings, forcing the application to create a (new) backup right away. """ + def post(self, request): + backup_settings = BackupSettings.get_solo() + backup_settings.latest_backup = timezone.now() - timezone.timedelta(days=7) + backup_settings.save() + + return redirect(reverse('frontend:configuration')) diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 910eff1ce..a0fbdcf80 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 2) +VERSION = (1, 2, 0, 'beta', 3) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index a306d3c93797283cf9ad7d95906cf1ba5874dc39..5981423e1276c7f0c5bfa889061d50b51b09329e 100644 GIT binary patch delta 5544 zcmYM&30PHS9>?*QRl_tEfegum8;PQ&VHvnol2WdOTbXv1BVN65QLdt-bDM@T+h&HV zZKGDUI;Jh8X;Z0{CE8+AW{a9r=1l6CEmmUL_s4m8<~;oQyzhJ7^X}(h-PI8F)UK%T zf#lfbhATG8n2uP`+L#+jPfk>+F*{O?p~y5~GVZ|wJdF9+In9_noPzwAW&BdTwHU$I z@mwrUH>MR%MSe^fzj_)IHeoMe)?ycKe1fXjgb5gPzA^FG4%=fYs=*x87%#(iI2`M6 z0$zaM;yD=C!I(@u4>gfo%)i3W_fQRejcxI` z%{O5i^0D+z(j;Q@Kv4s{3}f*c9FNyY`Zudd`0-a{Rn7DaMvDtk`K73aA3-&^*18F` z0^3m?>_yc(jQ8V7)Wq&&Uz4y7m45=Yvg8c6 z8z05)xC1q#6R3elb@Em$4z)t5r~!6HZQ13hEgWs{Pe2X0v{TraVI(Rk&|YrB{`fXt zioc=uy07Ckl#lAL7_~yjN=s1;d`EQWa%brwEHb@VN2f~W9W9K=2-zZ8`Ze@H@y zts|}KF!e&cZUa#R8j1nD4`*N##^N-3jl(j`!E)rsJjkzX+=7Ggh&7u+x-w;0fcJQY zO#_KM3gR#F_O1ZcK@n={My=2_3RG(ZPMlwwqs3d(?sHwZcNwj7MSuUXSrO1xwIHot;;(2v6d0%%_oK zSc}?{Ila987Gn|pn>rH5qKx?hpCsSV+Z%DPk1-YGZ^Z;Wfn)JB4#N=_d-a#$2=Z54 z;=L71Py>AkQ}7YgTTqWWGdt0b`!KB6?5e)rOva%)nv7bJG8~1AFbQ{|8rYBe!W~6z zRa`%Bg%VIpoNT=a)$t(IcV--FODe2)^ke}%g!Xk9&-@Hm9lN39rw#Nr~hiU`r{e2DDKJz{@HWM@07+!fZ5Orv0VDsyRdMy{D22hJ??*Y`=T7w$+ zYxt7h|6L@sv7af&R{vlTxCoU=in`P2-U$&?4O>Shni_Es>A!O ztF7x%TlETR1$JUs759-?k6)uk9vSK#qLrwIH=>q!J8GqNV+9t$*2|Ufof+EY5+xrtbYcH2^8q`R-y9uVh*ms9{3S<#NSc%GB`=f=izuPMm@L2 zx*hY$A41Nr$>ejXflS0W45GGb-Z0i*BfXOXHM|_v&~q4%yHNM{pdL7g#rQpH28F}D zZ~XOmKKT`>71)59@$0CSYP5cW+Op5FHU1DLp)ELrH)87|V`gC~>cJ0COV)^bUk{)f zPQI2uK$wlo@D^N(iPy3J_%LcBokkeb8}m`m&B9y^V`sUJg!XthYDo{GW_ZRrdZhO^ zV72ump3D6qqrAg55?hg@3bRIg_m`t)yb}B1Q`lAS|6USV6f_}|Gnr#N z%TVPn*nFckbFBCNmtkA(KZY8>bEpnpMjAF-F$WK$W}3*XRNfCY(23Yq?|(fBE!8$u zhx<{72lD)!Kl5y8C7o~>bbvRKYS4r@Eg=&JBeDcpHXKjwuFO+ZLq)I z|38zs88;!TW;%>B<`ZVX>QB4@HUvO-KFKLS-g9aHg7xDc1we7l>x`du-J@}8&x4#WT! zV+wA;^RN-M!e3!5o<*%l>=f2tOPR!pQA0VHj0LC$N23}lwJtyn@E+8_9!GVs89QJD z>h<~xHGw8ny|k&Gy-@vJW%DIdS^tg{%%VUIFR?dP;f3U1LN(ZE?;k}CF#2Y1fT^ef z=Ab$ngleb6IvX{S+fWmI0CoR)RQ-3tBy?jxY6hoJHxhl`-|OzE4zEEqGzrx}h0Wh? z?>}r^hZ^`+d;cJ+{*U&4n`z#JE=2Vc?oUDuk3bE?XDig8_N>mj9xo=p6Zy87CalI` z(~bEjZo%j%RE-BEBY`j`)((^VX1hme8exb&Pn4 z_<;DFXe7E2vj|-Wh<79FlGEd!B(*=%klZEff4X6>Ox)X&!5@h&k+vxr;T5EABOKy! z;%8zk@fGnJ(Q*}#7)^X=3l6s2zy{)D;!0cQ$9m#?VkhwqF@?~{ZAV;7yiYu$efY7d z4J2Jhyl%_Nt>57nHr>K|HZd71i04~wU>^q2DK#$lBB!jB?5L;e7p87ZNt-^?Eu9x|oeHhp(JvC4-!+cJB?Ibn^Sh^KjS2WFoJtxm_0M&uhnxz(JFnVpZaetz%5l_aBgYHDRXPwP;WCbSk6;Uwa+&<$mHsePg?(;kwqjSdk9GgAtD5kAX1`|2$CY!5K22GmJSBPM7^!{7$&FY@G@oE zpkpbcv?NV*baYZx#RS!1Y@xt739a<<5&Ga8I1-QfekSpM`EI+f3uiGF`hwI)jS<#OcNY~$`_*=cA*+9wXQ*} zz-Ckjm8g0L@K5*!YGPB^*C3pY%D;wM+2!ccOxKd|#NGBrC2FMAs0ThnHGCYk1?N!% zyN_Pz!}{ue05S*D47GA87>k3k4bDJq@k(TDrm`jLuZkxq(4O4HLFgat9HP;v4yR!| zd>P|$D{4l^Py@e&TCuCB6?%voV1pQE%OX)**co*{4K?8YF)mIbi6IndFV|oyZow3+ zMeTKPtkX~ws>80R6-q@-ARV<*1=b=QLVhw1#yzO|Ud&P*`(Yx6yGW>kewd4e_!@4) zg_zLVaSO6ICXV%MiboemOEOWz5Zyh*bbB9k#MA?MG$jd{2aebGO`d40oB6Y7LI3w=;4Jp#3o zGcZ)|e<_Jr3N|3yZK_dwa|wMgfaz(bVd#fZ=#B9>9FtIIW-;dChd2N|Y2-EzMr}pU zj?Q7uLe(q8+b$3Gn#5)bR&;VkoYtA;CO-iEunKeV6I4CFWam)5k9rG!LJhD<7h^&& z48t)2bw>JPG3KK_&3jN2ID#&9aDs$hvs%o@2N;BzU7ZFBP+zo(sJ$;it<1})rCn-W zhw8Wj^<6oFTJkH_N2u>ZXg8<5&fQpljX0MA?MV^p!%%`c&2OMOuCyLUb$HX}^^V4p zZ;om>9aVoM>deeUwdc0?-$M=XFlvC8QrLfuu#N&f7|cmjLmjO-sEU(NhpohxuR+x> zx8*gc3EZ^hz8nZ0($=UBvr+97q1vBk^DA5=!YTNxwHh_@)2Ii2#QG&mbLw?Q%_ti+ zfJvx&3sD1HZSU_!9pr|Vp&h;FwO7f9KJ>9N%=C= zVR{{#;G0;+;oXjU?Q(gkgK-#U;jb_ow__iCfU(#$!&#{Ue24zcED}0w&7N`&RU+!W z?S|}%>5q)bEI?jyQ;s^c=TWcKb<}D81~q^>RC@vR8iFyXfp^0S%*1f~4*m502lRDD z6p4+vk&3)&rY~ydGcgqBpa!%Iqj4Xq!&=mH_b>wMPy-9jbUtX&sQZbimFkXR_!I`x zzZtFsK8KpgY@C4$@Yi@9OK?;_r-Lt1^>3kOT8HY;pN*A~);6fEO2+!{fGy9*os<`% zOCxL4-#J7fsD?YDmN*@?RN3f>MYen*>Vq>KHKW<+k0q%3OHnJf9@S0-Y5*Uj4sQ+W z@ZRXp`m4Z`6Vm}>FaZZ*3!HqI)5)T9pp@8HFlzW z7wWmMFbN-GYm6K0Y;iVfg^e115I&AyV2Tx)l*5Y{V!9%~n zH&FK*KjX|e1Ur*&fo*Uww!&G+99+ijBuuTn(QZin4U=niqu&2o48Vw?P6ut#mwXbc z;Z)Qa8jG6g5?j6vHPEA|=M$K%wmc2P_5K%-(1&6wYRML1EV@y9T!A`FHK>taL2ZpU z`{9SZP=_oFwNisnXK6If#R-^-C-GVIAMUK|4E$d2|3@Sm;|C+00aT+-`67|2P}fD%v>Nk*0Dpeu~TBoYg7J}UnJ z^?>gH+CB8E~4tyS(|ba)lodEya%?xd{n#BZ24l0CckDp>#qi@ zY=vVOO#T{bgg>AL7C6Caur;co9@b}2^f!V zR$?**JCSdNxro2T#7X>df*Vo)N09%VbJ~YK@9gm?)Q9VN)M1>0TCsUZb@Q%!V$;O7 zACtO9{6KJ{e)AThPRZMZdi>hGt7(Yq9x1+srkv2FN$G>ef|)-P|0ebm>SG6?k6z$0bj~@{4+x$_~LS7_B5^oW@P7yy7BZzs#FyfK>Oi)zr8dAEB6J-SdxS5xT z6NIj-L|%Q$dG8BIR}lXrUM0E`x;D5of};}tOX?lsX@ZYO{kQKB>Y7G;Li~r=;(jGK zqWe}-+X-DdS2u~>L=AC<_=1QdrV_f&6NlY3!4Y1YNS$-v2##xYTQ}_0694rigAa(m zyOTnqTyK(EOvDm@As!M#iA%&@;>p#U1pgG6W4567$qhV6d`V>5vSQpt=wyFR93aLM zI=F$vK;oaoI{jG?K_Z@5PUvb!+#>c7?TKx~PsDJdC!s5c_=npgG{j@AJ1jKLYoiL? z8KF_GuSi@_j%$cR{hzIRS3b3Q4-e;iXtVYF&1PDmw@pvS4+*!;|B`B(`Nq1_vGA95 z>R-I;wnQ&!2I-Z=N49K+^$wo3=_eeqiE;QM@t(U&SV+=cQj>|3L^x4O>>;9vF+>=l zYc=t`dsbLGkIm(4!zx3{Cnv1(F3(HOXxy+%&t56+<>_s_l;~1kl^!2a{&-laPkCM8 HyMF%%h=Wq+ diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index 1734b5248..7c5bc0b3a 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-02 19:42+0200\n" -"PO-Revision-Date: 2016-05-02 19:41+0100\n" +"POT-Creation-Date: 2016-05-02 23:32+0200\n" +"PO-Revision-Date: 2016-05-02 23:19+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -378,6 +378,12 @@ msgstr "Alle instellingen" msgid "Setting" msgstr "Instelling" +msgid "This will simply alter the latest backup timestamp displayed above to a week ago." +msgstr "Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up een week in het verleden wordt gezet." + +msgid "Schedule new backup now" +msgstr "Plan per direct nieuwe back-up in" + msgid "Watt" msgstr "Watt" From 7ff08ef669674384e1217b83fa754fbbca678c2d Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Mon, 2 May 2016 23:47:52 +0200 Subject: [PATCH 04/13] Merged pull request 'Update clean-install.md #131' by 'WatskeBart' --- docs/changelog.rst | 1 + dsmrreader/__init__.py | 2 +- dsmrreader/archive/clean-install.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 7a70e01d1..5344318ab 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,6 +7,7 @@ v1.2.0 - 2016-xx-xx - Energy supplier prices does not indicate tariff type (Django admin) (`#126 `_). - Requirements update (`#128 `_). - Force backup (`#123 `_). +- Update clean-install.md (`#131 `_). v1.1.2 - 2016-05-01 diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index a0fbdcf80..4a348a1e0 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 3) +VERSION = (1, 2, 0, 'beta', 4) __version__ = get_version(VERSION) diff --git a/dsmrreader/archive/clean-install.md b/dsmrreader/archive/clean-install.md index 5b8d55c46..451d91b03 100644 --- a/dsmrreader/archive/clean-install.md +++ b/dsmrreader/archive/clean-install.md @@ -2,7 +2,7 @@ Only required when you didn't have your RaspberryPi installed at all. ### Raspbian ### -Either use the headless version of Raspbian, [netinstall](https://github.com/debian-pi/raspbian-ua-netinst), or the [full Raspbian image](https://www.raspbian.org/RaspbianImages), with graphics stack. You don't need the latter when you intend to only use your decive for DSMR readings. +Either use the headless version of Raspbian, [netinstall](https://github.com/debian-pi/raspbian-ua-netinst), or the [full Raspbian image](https://www.raspbian.org/RaspbianImages), with graphics stack. You don't need the latter when you intend to only use your device for DSMR readings. ### Init ### Power on RaspberryPi and connect using SSH: From 0774dda511510acc05cd7ac09155bd6cfbf493a8 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Wed, 4 May 2016 21:58:39 +0200 Subject: [PATCH 05/13] Improve data export field names #132 --- docs/changelog.rst | 1 + dsmr_frontend/views/export.py | 10 +- .../0005_statistics_exportverbose_names.py | 99 ++++++++++++++++++ dsmr_stats/models/statistics.py | 59 ++++++++--- dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 26022 -> 26322 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 29 +++-- 7 files changed, 171 insertions(+), 29 deletions(-) create mode 100644 dsmr_stats/migrations/0005_statistics_exportverbose_names.py diff --git a/docs/changelog.rst b/docs/changelog.rst index 5344318ab..df94483ce 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -8,6 +8,7 @@ v1.2.0 - 2016-xx-xx - Requirements update (`#128 `_). - Force backup (`#123 `_). - Update clean-install.md (`#131 `_). +- Improve data export field names (`#132 `_). v1.1.2 - 2016-05-01 diff --git a/dsmr_frontend/views/export.py b/dsmr_frontend/views/export.py index 2cf43a5b3..d7cb4fa97 100644 --- a/dsmr_frontend/views/export.py +++ b/dsmr_frontend/views/export.py @@ -78,6 +78,7 @@ class Echo(object): def write(self, value): """ Write the value by returning it, instead of storing in a buffer. """ return value + pseudo_buffer = Echo() writer = csv.writer(pseudo_buffer) response = StreamingHttpResponse( @@ -93,7 +94,14 @@ def write(self, value): return response def _generate_csv_row(self, writer, data, fields): - yield writer.writerow(fields) + if not data: + raise StopIteration() + + # Write header, but use the fields' verbose name. + data_class = data[0].__class__ + header = [data_class._meta.get_field(x).verbose_name.title() for x in fields] + + yield writer.writerow(header) for current_data in data: yield writer.writerow([ diff --git a/dsmr_stats/migrations/0005_statistics_exportverbose_names.py b/dsmr_stats/migrations/0005_statistics_exportverbose_names.py new file mode 100644 index 000000000..07bcd4c27 --- /dev/null +++ b/dsmr_stats/migrations/0005_statistics_exportverbose_names.py @@ -0,0 +1,99 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dsmr_stats', '0004_hour_statistics_gas_default_retroactive'), + ] + + operations = [ + migrations.AlterField( + model_name='daystatistics', + name='average_temperature', + field=models.DecimalField(decimal_places=1, verbose_name='Average temperature', null=True, default=None, max_digits=4), + ), + migrations.AlterField( + model_name='daystatistics', + name='day', + field=models.DateField(unique=True, verbose_name='Date'), + ), + migrations.AlterField( + model_name='daystatistics', + name='electricity1', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 1 (low tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='daystatistics', + name='electricity1_cost', + field=models.DecimalField(decimal_places=2, verbose_name='Electricity 1 price (low tariff)', max_digits=8), + ), + migrations.AlterField( + model_name='daystatistics', + name='electricity1_returned', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 1 returned (low tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='daystatistics', + name='electricity2', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 2 (high tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='daystatistics', + name='electricity2_cost', + field=models.DecimalField(decimal_places=2, verbose_name='Electricity 2 price (high tariff)', max_digits=8), + ), + migrations.AlterField( + model_name='daystatistics', + name='electricity2_returned', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 2 returned (high tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='daystatistics', + name='gas', + field=models.DecimalField(decimal_places=3, verbose_name='Gas', null=True, default=None, max_digits=9), + ), + migrations.AlterField( + model_name='daystatistics', + name='gas_cost', + field=models.DecimalField(decimal_places=2, verbose_name='Gas price', null=True, default=None, max_digits=8), + ), + migrations.AlterField( + model_name='daystatistics', + name='total_cost', + field=models.DecimalField(decimal_places=2, verbose_name='Total cost', max_digits=8), + ), + migrations.AlterField( + model_name='hourstatistics', + name='electricity1', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 1 (low tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='hourstatistics', + name='electricity1_returned', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 1 returned (low tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='hourstatistics', + name='electricity2', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 2 (high tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='hourstatistics', + name='electricity2_returned', + field=models.DecimalField(decimal_places=3, verbose_name='Electricity 2 returned (high tariff)', max_digits=9), + ), + migrations.AlterField( + model_name='hourstatistics', + name='gas', + field=models.DecimalField(decimal_places=3, verbose_name='Gas', max_digits=9, default=0), + ), + migrations.AlterField( + model_name='hourstatistics', + name='hour_start', + field=models.DateTimeField(unique=True, verbose_name='Hour start'), + ), + ] diff --git a/dsmr_stats/models/statistics.py b/dsmr_stats/models/statistics.py index 67e3c90ec..9ad342d74 100644 --- a/dsmr_stats/models/statistics.py +++ b/dsmr_stats/models/statistics.py @@ -1,25 +1,42 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ class DayStatistics(models.Model): """ Daily consumption usage summary. """ - day = models.DateField(unique=True) - total_cost = models.DecimalField(max_digits=8, decimal_places=2) + day = models.DateField(unique=True, verbose_name=_('Date')) + total_cost = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_('Total cost')) - electricity1 = models.DecimalField(max_digits=9, decimal_places=3) - electricity2 = models.DecimalField(max_digits=9, decimal_places=3) - electricity1_returned = models.DecimalField(max_digits=9, decimal_places=3) - electricity2_returned = models.DecimalField(max_digits=9, decimal_places=3) - electricity1_cost = models.DecimalField(max_digits=8, decimal_places=2) - electricity2_cost = models.DecimalField(max_digits=8, decimal_places=2) + electricity1 = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 1 (low tariff)') + ) + electricity2 = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 2 (high tariff)') + ) + electricity1_returned = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 1 returned (low tariff)') + ) + electricity2_returned = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 2 returned (high tariff)') + ) + electricity1_cost = models.DecimalField( + max_digits=8, decimal_places=2, verbose_name=_('Electricity 1 price (low tariff)') + ) + electricity2_cost = models.DecimalField( + max_digits=8, decimal_places=2, verbose_name=_('Electricity 2 price (high tariff)') + ) # Gas readings are optional/not guaranteed. - gas = models.DecimalField(max_digits=9, decimal_places=3, null=True, default=None) - gas_cost = models.DecimalField(max_digits=8, decimal_places=2, null=True, default=None) + gas = models.DecimalField( + max_digits=9, decimal_places=3, null=True, default=None, verbose_name=_('Gas') + ) + gas_cost = models.DecimalField( + max_digits=8, decimal_places=2, null=True, default=None, verbose_name=_('Gas price') + ) # Temperature readings depend on user settings. average_temperature = models.DecimalField( - max_digits=4, decimal_places=1, null=True, default=None + max_digits=4, decimal_places=1, null=True, default=None, verbose_name=_('Average temperature') ) class Meta: @@ -33,15 +50,23 @@ def __str__(self): class HourStatistics(models.Model): """ Hourly consumption usage summary. """ - hour_start = models.DateTimeField(unique=True) + hour_start = models.DateTimeField(unique=True, verbose_name=_('Hour start')) - electricity1 = models.DecimalField(max_digits=9, decimal_places=3) - electricity2 = models.DecimalField(max_digits=9, decimal_places=3) - electricity1_returned = models.DecimalField(max_digits=9, decimal_places=3) - electricity2_returned = models.DecimalField(max_digits=9, decimal_places=3) + electricity1 = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 1 (low tariff)') + ) + electricity2 = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 2 (high tariff)') + ) + electricity1_returned = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 1 returned (low tariff)') + ) + electricity2_returned = models.DecimalField( + max_digits=9, decimal_places=3, verbose_name=_('Electricity 2 returned (high tariff)') + ) # Gas readings are optional/not guaranteed. But need to be zero due to averages. - gas = models.DecimalField(max_digits=9, decimal_places=3, default=0) + gas = models.DecimalField(max_digits=9, decimal_places=3, default=0, verbose_name=_('Gas')) class Meta: default_permissions = tuple() diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 4a348a1e0..c14854127 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 4) +VERSION = (1, 2, 0, 'beta', 5) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index 5981423e1276c7f0c5bfa889061d50b51b09329e..a82a0a881c4718b9515ae23e27ff8bb87fceb0e7 100644 GIT binary patch delta 5919 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 diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index 7c5bc0b3a..b2d92e16c 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-02 23:32+0200\n" -"PO-Revision-Date: 2016-05-02 23:19+0100\n" +"POT-Creation-Date: 2016-05-04 21:56+0200\n" +"PO-Revision-Date: 2016-05-04 21:53+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -121,10 +121,10 @@ msgid "For your own reference, i.e. the name of your supplier" msgstr "Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" msgid "Electricity 1 price (low tariff)" -msgstr "Elektriciteit 1 (daltarief)" +msgstr "Prijs elektriciteit 1 (daltarief)" msgid "Electricity 2 price (high tariff)" -msgstr "Elektriciteit 2 (piektarief)" +msgstr "Prijs elektriciteit 2 (piektarief)" msgid "Gas price" msgstr "Gasprijs" @@ -616,6 +616,21 @@ msgstr "Notitie" msgid "Notes" msgstr "Notities" +msgid "Date" +msgstr "Datum" + +msgid "Total cost" +msgstr "Totale kosten" + +msgid "Electricity 2 returned (high tariff)" +msgstr "Elektriciteit 2 teruggeleverd (piektarief)" + +msgid "Average temperature" +msgstr "Gemiddelde temperatuur" + +msgid "Hour start" +msgstr "Begintijd uur" + msgid "Weather" msgstr "Weergegevens" @@ -868,9 +883,6 @@ msgstr "Engels" #~ msgid "Daily gas usage" #~ msgstr "Dagelijks gasverbruik" -#~ msgid "Daily average temperature" -#~ msgstr "Dagelijks temperatuurgemiddelde" - #~ msgid "(in °C)" #~ msgstr "(in °C)" @@ -886,9 +898,6 @@ msgstr "Engels" #~ msgid "Gas cost" #~ msgstr "Gaskosten" -#~ msgid "Total cost" -#~ msgstr "Totale kosten" - #~ msgid "Theme by" #~ msgstr "Thema door" From 23f6b64dd3012f03bcf206daac89cc05cfa6239b Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Wed, 4 May 2016 22:00:55 +0200 Subject: [PATCH 06/13] Improve data export field names #132 --- docs/changelog.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index df94483ce..f4566dc80 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -8,7 +8,7 @@ v1.2.0 - 2016-xx-xx - Requirements update (`#128 `_). - Force backup (`#123 `_). - Update clean-install.md (`#131 `_). -- Improve data export field names (`#132 `_). +- Improve data export field names (`#132 `_). v1.1.2 - 2016-05-01 From f05d6437a5257ea3e0a20e921db09b0c13bdddc3 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Wed, 4 May 2016 22:18:22 +0200 Subject: [PATCH 07/13] Footer update: DSMR (Dutch Smart Meter Requirements) reader --- .../templates/dsmr_frontend/base.html | 2 +- dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 26322 -> 26388 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 488 +++++++++++++----- 4 files changed, 367 insertions(+), 125 deletions(-) diff --git a/dsmr_frontend/templates/dsmr_frontend/base.html b/dsmr_frontend/templates/dsmr_frontend/base.html index cf4ffb877..fd1c9306b 100644 --- a/dsmr_frontend/templates/dsmr_frontend/base.html +++ b/dsmr_frontend/templates/dsmr_frontend/base.html @@ -129,7 +129,7 @@ {% block content %}{% endblock %}
- “{% trans "DSMR reader" %}” {% trans "created by" %} Dennis Siemensma © 2015 - 2016 + “{% trans "DSMR (Dutch Smart Meter Requirements) reader" %}” {% trans "created by" %} Dennis Siemensma © 2015 - 2016 | {% trans "Theme created by" %} web-apps.ninja © 2015
diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index c14854127..e5ec92717 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 5) +VERSION = (1, 2, 0, 'beta', 6) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index a82a0a881c4718b9515ae23e27ff8bb87fceb0e7..ca926964a499107bfcd8310f28c5a2b190efef1c 100644 GIT binary patch delta 4058 zcma*pi*uF58OQNGAvb|QPRIoaNnTP?2pS1VAV4E&%Hd`b^aKbEu|OavG#~^HhnkGo zw^V0ZZ>WT(D5Z8<7%>8k25q6ri!L{vH=54EvLsJk)SwJ%0x^gc{yee(+n9(H3M zzKc4ePcaFzs3c$>_QwKD#A2L><)}OK7|zDGaTccB#`$AC4!~(e_Hy5a>er0^#egw; zDeRRk1Ovsn?+vJcwaDiZd~HyzSqDHPi=|*teqr73fOTxV1P0H=r)_lbC|f zVJp5|LjKbzH~5fb<1y{`sGZpmZKI7yZUnUsBc8g`&-xk z8tN|n6*b>A_dL_*;1uC_RD`oo5jLR~>Of7@>D-IzcLa3_&%5?-Q2mFO+x9Zl2EwTJ zHq_;P7&CDXY99X(1ugJ5*YK6=5S(N?jzL9Ui5jpJZ)OZNQ5R}Qdr%7?>)3OL{iN^5>C}(n3{0D9zYh)Q>HUA2LJkiO;B$Bqb=iJWX)o1gOr`z|a{T56 zBu4WAj=|yIwV9ZP3UDFnb&H^0)3vBe-j160QPdsVjwwEc7b)z+H&7{!RoRIiMFrM{ zx8OeH4K=T$GH?mg@e5R7N#C=Vv;wtYBWm1g%))k5U{B&e{1y7@@H_>jtQRxzRn)iq zg!3F~Czo**{s-GI!nxg#e?ct}4%u<7$T!EdqjtO#weTODZ=;Uvc!>P#49~g;pW$BW zS5blO;^2njOQ?X}MWy%@DpMCQ0k5Mn62}4Sc_OMkh}u{dYR4XGToEdBp&8^~0~%;h zAkCPKQ5=Swa3t=+vG@)a;uX~G&f{~aeifLH^{9RwSdTkU^L_2inq>_4)s!Ol+qC%< z6j3)S;)AHO>qA9+3bnw;sEGoz?NQ{Qo{vKHACGkyLT%)i$Plv=mBCAxj7fLeou{HQ z<`=j^A?gf^P#veE&TI}g;zC@3ub>8wthNgkV1MeR$op)jqEZ{hx%e~Of~WCeTvKCz zXIw)z@<4K?r`EW)#>l%~wFXJ3p;c_nJ6_c(u#{F%7BtYK7UeuKJvdoT&# zz=ha{i!lFge$eXu-$+3nuAp}QUmS;tVf({jBI*t_B3U#KIQv|CkZ9Ci>U;q8edxm! z43GxRKNvNC7LGy>$Ljr`PC+|e;~sRPBK;$3f+6$l*^fj8atG?pEXE=DBTUCf(8Fg@ zXZ|Lt-}|U>m$4Mn=G!Bifxa$Xn1WKa028qp*W*f@i05z#4z0H-?!d38AI1TAaDffr z7}8|UPhbNU|G@rd^9U-i zov4AkF%u8C=YPfw>KCyC<2Yc|H=xFC#vne8>G%TPi*GI>|4L!eV*5p^LT;rAV?3@x zWhRPBsgIgyD{4pGs0m*~&2z%}5h}oIs6c{C?EIrquX8!-Z43JphEr%ob$rPA3~Hes zSAPq2`%j`KzJlsMu*rV&^HCF4p`JIO0$hU%@Ih37TT$b7qx$)8xx)LXj+aq8O;~C> zhnlAkwZIuy|I$5AUS|7cW3Jx++bL*3Eo#70*P#Qo zqsLGI>_GK9fC}Wed;SUP$V{_!1Qt`BgnV;ME8d4MV>cE>xE}#Bi3xfUPq)}JK8OA2 za0zwEzCfkSEbr`2Z3&ppU@$9C+F2Or0R*L%Ym`x8fx39XMU z`=K{?RZ}$P)kb2Gs8<(RyS_CVSru6wTUY2sBTdbbXlMKgueW$amKR?#WqfI8b;YQD o6ndi-7m}ui=GNAE|K~jB<`U~-O|jN>vDV1S$m-r$Xi@(E02DU$KL7v# delta 3988 zcmXxmc~F&A7{~E*S;QTY)djqwg<>cu2%$zAAfgbiSQc(Uf;&rEF0VCVS~@mir4`v^ zrK9HL&}3=jQr0w;qBfLf+G5rpxWtrYu6=)=(~RTi?8|eW`|A25zT<~|@4e;oB8@S@ z-HmC7-LO3-I8(6`_2JkN$Dzhe$Cq#}w!xrSW5Tc_s_w_On20f$hCx_}fjHjv7snd! zcE=1FH1Sc?1`9C)m!S^$0tVw&*S{0HQs0Bo*o1z(fW5I}oH4y{5O%|2)VM0_iO-?N zy&LBlGn&G28aiWK54&*+CQ#4CJ8>TBhA*OSumwYLJ1Sy(Q3w43qwoxd;APi;19h>s zeq%;r6n4N8kHTOIb1)S*V{1HtTIgrghF4G_ypFnwk83DmU7WqJhhV zMcs4@=Hn$-&twtRpF$$&nZp#6WT&weUPK+}GS0y)b}7Rh7=+;oHWy+rk$N1`Wkw-? z%mV((!VS(7$lfNVk1<1WnDYrtV}G-og5K}~YJ;oT8gC&%Fs=Jq`yoLvg-GI?N-V&2 zsPU&!+5Q_Uw6{ht=HYofk7;+=Cy7t8$=x3{?mqO+`;1vj;cXh87+_EAPbTB3r=T`` z1IOZa9Emqj<8xAMvNfZA9T@}dLGw}biZC3fpptn$cEFWbj_U^!|IQR{(x4lK4YCts zP{03PScn;@4W2{KWJGiOvzJ#9tqh2WilP zH5iWTP;ayu^#M7E%JS2wao3$uX?DY8RC_M^aT;pfCtdq%s9gF0wcbhBf7zp;6L#VO zb;1PH3GYQMI2pB2rE@K6+*VW)9(3(zP~-n~?cwS60?DZMLR9k3!YEvWTF2W=K^uJR z8oqM_{&0q5*ptVhCJe{h5koChgSycg)J9t|20uX^@D!^53M#oH?zW~Pui}{r6z-#A z6)wiFu^w|WjrktWqOyPA5Str^Fpzp9Di^*%eTsj^dXl*X^>bV|%zn~0U=H=|n2Rl# zg&Ftgsd)dz6k=)Eh+A+sD%qwoN=da4JK^KVvzup;Gn)O#C&K)TibVXq_JDU|JL=h} zq%J}wc`<6;3RI3Q#SR{Y=PA68ucHjY;892*BjQmj_tUU`fk+0%6PaKT!1>zYSf2i11eIRF&Out zB60xLf5^2rqAu2iy73v*yk=D70&_sLbO=c!4f;+G^euldF5mdyyv##(v>J6Jw0|WEz+qK6j)MKy$t5Fkw zL`Cc@w#63Y_iV1CHb@>#B4ZA&$Bnoe`;W2z&-f6zkY|P!&`8GvsEMmE3F}cI{R;K= z7f~Um+hSo_cB5N9o_z0uWM{_p2>`aaZR2i%W3z+u$-O{jIxV4{Bify7BS?T_jhi#q9J zs0EIp-u_3_hSyM896P~&NK#Re%R@gtjC%9ssBtf&=Iz8mcog+yK@*9;k}i~jk}VRI zT=7_geQ_{u!fE&|D%9zu_7z--`h9!F_5jZzP38?88DPvm*hD>x+jPcA5@{j!L0#;X zDa3z1g{?HCV$4HK#sYi*FJf2Bd)OXqCTd~@M&V*q|2mAsZTL7IaP>?cS{Ew9Ff7Ih zEXO&xyoC6NQ)s3k6mOwI9Xi$i$D$u9GRdfr4nr+833a1cs0Ejx)_LCf7V3Z>q7K%G zTK^pC=X@EXG1Qx8Z;*f*IKnv@wb49RUxD4Jzl2)20X6e_!mP59Hbx0zvY5RYmfial@~Dk7Drb!t%?yyEJ+ zT>t0JlgPn6bKVVTH`7k=qZUd>-6$Wm(G1kWi%|z$>-yh8J=s3z_n1umZ{(X}5*{&T z5mwMv=GW*7xFpvQ|P)YV4DrEc0>b7+%^X;n(3yby*tm_-L*Jm2e zg-s3cU2DjRXy@|{Y8V^&QLDQ2?p*^)D;q|3@97Up$xItuH)m+?Kne|YL(hf87L-<( iR#sI{uP(2uE-#&3I?rT}FBq3pSvvg@CVh}y68|4Su;q6E diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index b2d92e16c..4bba3986f 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-04 21:56+0200\n" -"PO-Revision-Date: 2016-05-04 21:53+0100\n" +"POT-Creation-Date: 2016-05-04 22:13+0200\n" +"PO-Revision-Date: 2016-05-04 22:13+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -21,11 +21,18 @@ msgstr "" msgid "Backend" msgstr "Achterkant" -msgid "Unsupported database engine \"{}\" active, some features might not work properly" -msgstr "De database engine \"{}\" wordt niet actief ondersteund, sommige functies werken hierdoor mogelijk minder goed" +msgid "" +"Unsupported database engine \"{}\" active, some features might not work " +"properly" +msgstr "" +"De database engine \"{}\" wordt niet actief ondersteund, sommige functies " +"werken hierdoor mogelijk minder goed" -msgid "Generates a generic event triggering apps for backend operations, cron-like." -msgstr "Genereert een generiek signaal dat gebruikt kan worden door plugins voor achtergrondoperaties, zoals cron." +msgid "" +"Generates a generic event triggering apps for backend operations, cron-like." +msgstr "" +"Genereert een generiek signaal dat gebruikt kan worden door plugins voor " +"achtergrondoperaties, zoals cron." msgid "Forces single run, overriding Infinite Command mixin" msgstr "Forceert enkele uitvoer." @@ -36,26 +43,45 @@ msgstr "Backup" msgid "Backup daily" msgstr "Dagelijkse backup" -msgid "Create a backup of your data daily. Stored locally, but can be exported using Dropbox." -msgstr "Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan geexporteerd worden via Dropbox." +msgid "" +"Create a backup of your data daily. Stored locally, but can be exported " +"using Dropbox." +msgstr "" +"Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan " +"geexporteerd worden via Dropbox." msgid "Compress" msgstr "Comprimeren" -msgid "Create backups in compressed (gzip) format, saving a significant amount of disk space." -msgstr "Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke hoeveelheid schijfruimte bespaard wordt." +msgid "" +"Create backups in compressed (gzip) format, saving a significant amount of " +"disk space." +msgstr "" +"Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke " +"hoeveelheid schijfruimte bespaard wordt." msgid "Backup timestamp" msgstr "Tijdstip van backup" -msgid "Daily moment of creating the backup. You should prefer a nightly timestamp, as it might freeze or lock the application shortly during backup creation." -msgstr "Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de nacht te pakken, gezien het maken van een backup de werking van de applicatie kort kan onderbreken." +msgid "" +"Daily moment of creating the backup. You should prefer a nightly timestamp, " +"as it might freeze or lock the application shortly during backup creation." +msgstr "" +"Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de " +"nacht te pakken, gezien het maken van een backup de werking van de " +"applicatie kort kan onderbreken." msgid "Latest backup" msgstr "Meest recente backup" -msgid "Timestamp of latest backup created. Automatically updated by application. Please note that the application will ignore the \"backup_time\" setting the first time used." -msgstr "Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer genegeerd!" +msgid "" +"Timestamp of latest backup created. Automatically updated by application. " +"Please note that the application will ignore the \"backup_time\" setting the " +"first time used." +msgstr "" +"Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. " +"N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer " +"genegeerd!" msgid "Backup configuration" msgstr "Backupconfiguratie" @@ -63,14 +89,32 @@ msgstr "Backupconfiguratie" msgid "Dropbox access token" msgstr "Dropbox 'access token'" -msgid "The access token for your Dropbox account. You should register an App for your own Dropbox account (https://www.dropbox.com/developers/apps). Please select \"Permission type\" named \"App folder\" to restrict unneeded access. Backups will be synced to a dedicated folder in your account. After creating your App you should be able to generate an \"Access token\" and enter it here. For more information, see https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" -msgstr "Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen account een applicatie registeren (https://www.dropbox.com/developers/apps). Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder\" om de gedeelde toegang tot je account te beperken. Backups worden hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" +msgid "" +"The access token for your Dropbox account. You should register an App for " +"your own Dropbox account (https://www.dropbox.com/developers/apps). Please " +"select \"Permission type\" named \"App folder\" to restrict unneeded access. " +"Backups will be synced to a dedicated folder in your account. After creating " +"your App you should be able to generate an \"Access token\" and enter it " +"here. For more information, see https://blogs.dropbox.com/developers/2014/05/" +"generate-an-access-token-for-your-own-account" +msgstr "" +"Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen " +"account een applicatie registeren (https://www.dropbox.com/developers/apps). " +"Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder" +"\" om de gedeelde toegang tot je account te beperken. Backups worden " +"hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox " +"een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" " +"genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox." +"com/developers/2014/05/generate-an-access-token-for-your-own-account" msgid "Latest sync" msgstr "Meest recente synchronisatie" -msgid "Timestamp of latest sync with Dropbox. Automatically updated by application." -msgstr "Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit automatisch bij." +msgid "" +"Timestamp of latest sync with Dropbox. Automatically updated by application." +msgstr "" +"Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit " +"automatisch bij." msgid "Dropbox configuration" msgstr "Dropbox-configuratie" @@ -79,16 +123,26 @@ msgid "Consumption" msgstr "Verbruik" msgid "Meter Reading electricity delivered to client (low tariff) in 0,001 kWh" -msgstr "Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt uur" +msgstr "" +"Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt " +"uur" msgid "Meter Reading electricity delivered by client (low tariff) in 0,001 kWh" -msgstr "Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 Watt uur" +msgstr "" +"Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 " +"Watt uur" -msgid "Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" -msgstr "Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt uur" +msgid "" +"Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" +msgstr "" +"Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt " +"uur" -msgid "Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" -msgstr "Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 Watt uur" +msgid "" +"Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" +msgstr "" +"Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 " +"Watt uur" msgid "Actual electricity power delivered (+P) in 1 Watt resolution" msgstr "Daadwerkelijk geleverde elektriciteit geleverd (-P) in 1 Watt stappen" @@ -118,7 +172,8 @@ msgid "Description" msgstr "Omschrijving" msgid "For your own reference, i.e. the name of your supplier" -msgstr "Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" +msgstr "" +"Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" msgid "Electricity 1 price (low tariff)" msgstr "Prijs elektriciteit 1 (daltarief)" @@ -147,8 +202,11 @@ msgstr "Per minuut" msgid "Compactor grouping type" msgstr "Metingen groeperen" -msgid "Electricity readings are read every 10 seconds. We can group those for you." -msgstr "Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je groeperen." +msgid "" +"Electricity readings are read every 10 seconds. We can group those for you." +msgstr "" +"Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je " +"groeperen." msgid "Consumption configuration" msgstr "Verbruiksconfiguratie" @@ -159,11 +217,18 @@ msgstr "Datalogger" msgid "Performs an DSMR P1 telegram reading on the COM port." msgstr "Leest een DSMR P1 telegram uit van de COM-poort (meting)." -msgid "Generates a FAKE reading. DO NOT USE in production! Used for integration checks." -msgstr "Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor integratietests." +msgid "" +"Generates a FAKE reading. DO NOT USE in production! Used for integration " +"checks." +msgstr "" +"Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor " +"integratietests." -msgid "Required option to acknowledge you that you WILL mess up your data with this." -msgstr "Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data kan verprutsen." +msgid "" +"Required option to acknowledge you that you WILL mess up your data with this." +msgstr "" +"Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data " +"kan verprutsen." msgid "Include gas consumption" msgstr "Neem gasverbruik mee" @@ -171,8 +236,11 @@ msgstr "Neem gasverbruik mee" msgid "Include electricity returned (solar panels)" msgstr "neem teruglevering elektriciteit mee (zonnepanelen)" -msgid "Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" -msgstr "Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-my-data" +msgid "" +"Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" +msgstr "" +"Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-" +"my-data" msgid "Timestamp indicating when the reading was taken, according to the meter" msgstr "Moment waarop de meting is gedaan, volgens de meter." @@ -181,13 +249,22 @@ msgid "Last hourly reading timestamp" msgstr "Tijdstip van laatste meting" msgid "Whether this reading has been processed for merging into statistics" -msgstr "Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" +msgstr "" +"Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" msgid "DSMR reading" msgstr "DSMR-meting" -msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." -msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor piektarief." +msgid "" +"Tariff indicator electricity. The tariff indicator can be used to switch " +"tariff dependent loads e.g boilers. This is responsibility of the P1 user. " +"Note: Tariff code 1 is used for low tariff and tariff code 2 is used for " +"normal tariff." +msgstr "" +"Tariefindicatie. Dit kan gebruikt worden om te wisselen met " +"tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is " +"voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " +"daltarief en tariefcode 2 voor piektarief." msgid "Number of power failures in any phases" msgstr "Aantal stroomstoringen in alle fases" @@ -199,19 +276,23 @@ msgid "Number of voltage sags/dips in phase L1" msgstr "Aantal spanningsdippen in fase L1" msgid "Number of voltage sags/dips in phase L2 (polyphase meters only)" -msgstr "Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage sags/dips in phase L3 (polyphase meters only)" -msgstr "Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L1" msgstr "Aantal spanningspieken in fase L1" msgid "Number of voltage swells in phase L2 (polyphase meters only)" -msgstr "Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L3 (polyphase meters only)" -msgstr "Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" msgid "DSMR Meter statistics" msgstr "Meterstatistieken" @@ -225,20 +306,36 @@ msgstr "DSMR-versie 2/3" msgid "Poll P1 port" msgstr "Peil P1 poort" -msgid "Whether we should track the P1 port on your smartmeter. Almost every feature inside this project requires this to be enabled. However, it might be disabled temporarily due to technical reasons, such as data migrations." -msgstr "Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, zoals datamigraties (bij updates)." +msgid "" +"Whether we should track the P1 port on your smartmeter. Almost every feature " +"inside this project requires this to be enabled. However, it might be " +"disabled temporarily due to technical reasons, such as data migrations." +msgstr "" +"Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke " +"functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan " +"desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, " +"zoals datamigraties (bij updates)." msgid "Track meter statistics" msgstr "Houd meterstatistieken bij" -msgid "Whether we should track any extra statistics sent by the meter, such as the number of power failures of voltage dips. Data is not required for core features." -msgstr "Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de basisfunctionaliteit." +msgid "" +"Whether we should track any extra statistics sent by the meter, such as the " +"number of power failures of voltage dips. Data is not required for core " +"features." +msgstr "" +"Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal " +"stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de " +"basisfunctionaliteit." msgid "DSMR version" msgstr "DSMR-versie" -msgid "The DSMR version your meter supports. Version should be printed on meter." -msgstr "De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op de meter." +msgid "" +"The DSMR version your meter supports. Version should be printed on meter." +msgstr "" +"De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op " +"de meter." msgid "COM-port" msgstr "COM-poort" @@ -276,8 +373,11 @@ msgstr "Weergaveconfiguratie" msgid "Archive" msgstr "Archief" -msgid "No data found. It can take up to one day before any data is visible here." -msgstr "Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer gegevens zichtbaar." +msgid "" +"No data found. It can take up to one day before any data is visible here." +msgstr "" +"Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer " +"gegevens zichtbaar." msgid "Select level of detail displayed" msgstr "Selecteer detailniveau" @@ -351,8 +451,8 @@ msgstr "Inloggen vereist" msgid "Configuration" msgstr "Configuratie" -msgid "DSMR reader" -msgstr "DSMR-reader" +msgid "DSMR (Dutch Smart Meter Requirements) reader" +msgstr "DSMR (Dutch Smart Meter Requirements) reader" msgid "created by" msgstr "gemaakt door" @@ -363,8 +463,12 @@ msgstr "Bekijk repository op Github" msgid "Theme created by" msgstr "Thema gemaakt door" -msgid "No data found. Please make sure the datalogger is up and running and the backend process is running as well." -msgstr "Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het achtergrondproces." +msgid "" +"No data found. Please make sure the datalogger is up and running and the " +"backend process is running as well." +msgstr "" +"Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het " +"achtergrondproces." msgid "Base selection" msgstr "Basisselectie" @@ -378,8 +482,12 @@ msgstr "Alle instellingen" msgid "Setting" msgstr "Instelling" -msgid "This will simply alter the latest backup timestamp displayed above to a week ago." -msgstr "Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up een week in het verleden wordt gezet." +msgid "" +"This will simply alter the latest backup timestamp displayed above to a week " +"ago." +msgstr "" +"Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up " +"een week in het verleden wordt gezet." msgid "Schedule new backup now" msgstr "Plan per direct nieuwe back-up in" @@ -441,14 +549,20 @@ msgstr "Selecteer het soort gegevens dat je wil exporteren." msgid "Day totals" msgstr "Dagtotalen" -msgid "Summary of each day. Contains electricity, gas and costs (if applicable)." -msgstr "Samenvatting van elke dag. Bevat electriciteit, gas en gemaakte kosten (wanneer van toepassing)." +msgid "" +"Summary of each day. Contains electricity, gas and costs (if applicable)." +msgstr "" +"Samenvatting van elke dag. Bevat electriciteit, gas en gemaakte kosten " +"(wanneer van toepassing)." msgid "Hour totals" msgstr "Uurtotalen" -msgid "Summary of each hour read. Contains electricity and gas (if applicable)." -msgstr "Samenvatting van elk uur. Bevat electriciteit en gas (wanneer van toepassing)." +msgid "" +"Summary of each hour read. Contains electricity and gas (if applicable)." +msgstr "" +"Samenvatting van elk uur. Bevat electriciteit en gas (wanneer van " +"toepassing)." msgid "Select date range start" msgstr "Selecteer startdatum" @@ -472,7 +586,9 @@ msgid "Excel (.CSV)" msgstr "Excel (.CSV)" msgid "Exports the data in Comma Separated Format, which can be read by Excel." -msgstr "Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door Excel." +msgstr "" +"Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door " +"Excel." msgid "Add note for this date" msgstr "Voeg notitie toe voor deze datum" @@ -492,8 +608,12 @@ msgstr "Gas" msgid "Meter statistics" msgstr "Meterstatistieken" -msgid "Tracking meter statistics is disabled. Enable this feature in the datalogger settings to view statistics." -msgstr "Meterstatistieken worden niet bijgehouden. Schakel dit bij de dataloggerinstellingen in om de statistieken weer te geven." +msgid "" +"Tracking meter statistics is disabled. Enable this feature in the datalogger " +"settings to view statistics." +msgstr "" +"Meterstatistieken worden niet bijgehouden. Schakel dit bij de " +"dataloggerinstellingen in om de statistieken weer te geven." msgid "Current energy prices" msgstr "Huidige energietarieven" @@ -510,8 +630,12 @@ msgstr "Elektriciteit 2 (per kWh)" msgid "Gas (per m3)" msgstr "Gas (per m3)" -msgid "No energy supplier prices found for today. Enable this feature in consumption settings to view prices." -msgstr "Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de verbruiksinstellingen om de prijzen weer te geven." +msgid "" +"No energy supplier prices found for today. Enable this feature in " +"consumption settings to view prices." +msgstr "" +"Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de " +"verbruiksinstellingen om de prijzen weer te geven." msgid "DSMR-reader" msgstr "DSMR-reader" @@ -531,8 +655,12 @@ msgstr "Metingen" msgid "Status regarding the latest data read from your meter." msgstr "Voortgang m.b.t. de meest recente gevens uit je meter." -msgid "It has been a while since the latest meter reading. Your datalogger process might hang or has been crashed." -msgstr "De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het datalogger proces of is deze gecrashed." +msgid "" +"It has been a while since the latest meter reading. Your datalogger " +"process might hang or has been crashed." +msgstr "" +"De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het " +"datalogger proces of is deze gecrashed." msgid "Latest reading" msgstr "Laatste meting" @@ -546,32 +674,53 @@ msgstr "Totaal aantal metingen" msgid "Background" msgstr "Achtergrond" -msgid "Status regarding processing readings, making them visible in other pages and graphs." -msgstr "Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze zichtbaar zijn in andere pagina's en grafieken." +msgid "" +"Status regarding processing readings, making them visible in other pages and " +"graphs." +msgstr "" +"Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze " +"zichtbaar zijn in andere pagina's en grafieken." msgid "Unprocessed readings" msgstr "Onverwerkte metingen" -msgid "There are too many unprocessed readings. Your backend process might hang or has been crashed." -msgstr "Er zijn te veel onverwerkte metingen. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "" +"There are too many unprocessed readings. Your backend process might hang or has been crashed." +msgstr "" +"Er zijn te veel onverwerkte metingen. Mogelijk hangt het " +"achtergrondproces of is deze gecrashed." msgid "Latest electricity consumption tracked" msgstr "Meest recente electriciteitsverbruik verwerkt" -msgid "It has been a while since electricity consumption was tracked. Your backend process might hang or has been crashed." -msgstr "Het meest recente electriciteitsverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "" +"It has been a while since electricity consumption was tracked. Your " +"backend process might hang or has been crashed." +msgstr "" +"Het meest recente electriciteitsverbruik is een tijdje geleden verwerkt. " +"Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest gas consumption tracked" msgstr "Meest recente gasverbruik verwerkt" -msgid "It has been a while since gas consumption was tracked. Your backend process might hang or has been crashed." -msgstr "Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "" +"It has been a while since gas consumption was tracked. Your backend " +"process might hang or has been crashed." +msgstr "" +"Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt " +"het achtergrondproces of is deze gecrashed." msgid "Data availability" msgstr "Beschikbaarheid gegevens" -msgid "Based on readings until this moment. Electricity usage should be always available. Gas usage and electricity return depend on your home situation." -msgstr "Gebaseerd op verwerkte uitlezingen tot nu toe. Electriciteitsverbruik zou altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering hangen af van je thuissituatie." +msgid "" +"Based on readings until this moment. Electricity usage should be always " +"available. Gas usage and electricity return depend on your home situation." +msgstr "" +"Gebaseerd op verwerkte uitlezingen tot nu toe. Electriciteitsverbruik zou " +"altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering " +"hangen af van je thuissituatie." msgid "Data type" msgstr "Soort gegevens" @@ -582,12 +731,21 @@ msgstr "Gemeten" msgid "Electricity return" msgstr "Elektriciteitsteruglevering" -msgid "All data below is calculated among all consumption tracked until a day ago. Untracked consumption and any usage of today is not taken into account." -msgstr "Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin niet meegenomen." +msgid "" +"All data below is calculated among all consumption tracked until a day ago. " +"Untracked consumption and any usage of today is not taken into account." +msgstr "" +"Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en " +"met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin " +"niet meegenomen." #, python-format -msgid "Current data displayed averages %(hour_statistics_count)s hour(s), among %(day_statistics_count)s day(s)." -msgstr "Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, verdeeld over %(day_statistics_count)s dag(en)." +msgid "" +"Current data displayed averages %(hour_statistics_count)s hour(s), among " +"%(day_statistics_count)s day(s)." +msgstr "" +"Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, " +"verdeeld over %(day_statistics_count)s dag(en)." #, python-format msgid "Average hourly electricity consumed (in %%)" @@ -796,14 +954,24 @@ msgstr "Temperatuur (in ℃)" msgid "Track weather" msgstr "Houd weergegevens bij" -msgid "Whether we should track and log outside temperatures using an external service. Current service integrated is Buienradar" -msgstr "Geeft aan of we buitentemperaturen meten via een externe dienst, en ze bijhouden. Huidig gebruikte dienst is Buienradar" +msgid "" +"Whether we should track and log outside temperatures using an external " +"service. Current service integrated is Buienradar" +msgstr "" +"Geeft aan of we buitentemperaturen meten via een externe dienst, en ze " +"bijhouden. Huidig gebruikte dienst is Buienradar" msgid "Buienradar weather station" msgstr "Buienradar weerstation" -msgid "The weather station used to measure and log outside temperatures. Choose one nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of all locations." -msgstr "Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www.buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." +msgid "" +"The weather station used to measure and log outside temperatures. Choose one " +"nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of " +"all locations." +msgstr "" +"Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te " +"slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www." +"buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." msgid "Weather configuration" msgstr "Weergegevensconfiguratie" @@ -814,6 +982,9 @@ msgstr "Nederlands" msgid "English" msgstr "Engels" +#~ msgid "DSMR reader" +#~ msgstr "DSMR-reader" + #~ msgid "Electricity 1 price" #~ msgstr "Elektriciteitstarief 1 (laag)" @@ -830,10 +1001,18 @@ msgstr "Engels" #~ msgstr "Bezig met bijwerken/uitrollen van DSMR-reader" #~ msgid "Please note that this may take a while, depending on your device..." -#~ msgstr "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je apparaat..." - -#~ msgid "Info regarding the version of this application. Automatic updates are not available (mostly due to privacy reasons), but you should be able to update manually." -#~ msgstr "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een nieuwere versie." +#~ msgstr "" +#~ "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je " +#~ "apparaat..." + +#~ msgid "" +#~ "Info regarding the version of this application. Automatic updates are not " +#~ "available (mostly due to privacy reasons), but you should be able to " +#~ "update manually." +#~ msgstr "" +#~ "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk " +#~ "wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een " +#~ "nieuwere versie." #~ msgid "Updates" #~ msgstr "Updates" @@ -860,7 +1039,8 @@ msgstr "Engels" #~ msgstr "Weken in recente historie" #~ msgid "The number of weeks displayed in the recent history overview." -#~ msgstr "Het aantal weken dat getoond wordt in het recente historie overzicht." +#~ msgstr "" +#~ "Het aantal weken dat getoond wordt in het recente historie overzicht." #~ msgid "History" #~ msgstr "Geschiedenis" @@ -886,8 +1066,12 @@ msgstr "Engels" #~ msgid "(in °C)" #~ msgstr "(in °C)" -#~ msgid "Weather tracking is currently disabled. Enable this feature in weather settings to view temperatures (read hourly)." -#~ msgstr "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." +#~ msgid "" +#~ "Weather tracking is currently disabled. Enable this feature in weather " +#~ "settings to view temperatures (read hourly)." +#~ msgstr "" +#~ "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij " +#~ "weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." #~ msgid "Electricity 1 cost (low tariff)" #~ msgstr "Elektriciteit 1 kosten (daltarief)" @@ -901,11 +1085,20 @@ msgstr "Engels" #~ msgid "Theme by" #~ msgstr "Thema door" -#~ msgid "Number of times data read from your meter. Should be updated every 15 seconds." -#~ msgstr "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden uitgevoerd moeten worden." - -#~ msgid "Most data is processed with a small delay, but should take no longer than a minute to update. Gas consumption however, is only updated once a hour." -#~ msgstr "De meeste gegevens worden op de achtergrond verwerkt met een kleine vertraging. Echter zou het verwerken daarvan niet langer dan een minuut moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." +#~ msgid "" +#~ "Number of times data read from your meter. Should be updated every 15 " +#~ "seconds." +#~ msgstr "" +#~ "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden " +#~ "uitgevoerd moeten worden." + +#~ msgid "" +#~ "Most data is processed with a small delay, but should take no longer than " +#~ "a minute to update. Gas consumption however, is only updated once a hour." +#~ msgstr "" +#~ "De meeste gegevens worden op de achtergrond verwerkt met een kleine " +#~ "vertraging. Echter zou het verwerken daarvan niet langer dan een minuut " +#~ "moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." #~ msgid "Based on readings until this moment" #~ msgstr "Gebaseerd op metingen tot nu toe" @@ -917,10 +1110,14 @@ msgstr "Engels" #~ msgstr "Gemiddeld verbruik elektriciteit 2 (piektarief) per daguur in kWh" #~ msgid "Average hourly electricity 1 return (low tariff) yield in kWh" -#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) per daguur in kWh" +#~ msgstr "" +#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) " +#~ "per daguur in kWh" #~ msgid "Average hourly electricity 2 return (high tariff) yield in kWh" -#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 (piektarief) per daguur in kWh" +#~ msgstr "" +#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 " +#~ "(piektarief) per daguur in kWh" #~ msgid "Average hourly electricity demand in Watt" #~ msgstr "Gemiddelde elektriciteitsvraag per daguur in Watt" @@ -935,7 +1132,8 @@ msgstr "Engels" #~ msgstr "Dagelijks elektriciteitsverbruik in de afgelopen %(days_ago)s dagen" #~ msgid "Daily electricity returned in the past %(days_ago)s days" -#~ msgstr "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" +#~ msgstr "" +#~ "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" #~ msgid "Daily gas usage in the past %(days_ago)s days" #~ msgstr "Dagelijks gasverbruik in de afgelopen %(days_ago)s dagen" @@ -970,38 +1168,67 @@ msgstr "Engels" #~ msgid "Compacts existing DSMR readings into consumption points." #~ msgstr "Voegt bestaande DSMR uitlezingen samen in verbruiksgegevens." -#~ msgid "The max number of readings to compact this run (default: %(default)s)" -#~ msgstr "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt (standaard: %(default)s)" +#~ msgid "" +#~ "The max number of readings to compact this run (default: %(default)s)" +#~ msgstr "" +#~ "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt " +#~ "(standaard: %(default)s)" #~ msgid "DEPRECATED: Moved to settings in database." #~ msgstr "UITGEFASEERD: Instellingen zijn verplaatst naar de database." -#~ msgid "Purges all consumption data (DELETES IT!) and marks all readings as unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL HISTORIC READINGS!" -#~ msgstr "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" - -#~ msgid "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_backend" -#~ msgstr "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_backend" +#~ msgid "" +#~ "Purges all consumption data (DELETES IT!) and marks all readings as " +#~ "unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL " +#~ "HISTORIC READINGS!" +#~ msgstr "" +#~ "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle " +#~ "uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van " +#~ "groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" + +#~ msgid "" +#~ "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please " +#~ "use dsmr_backend" +#~ msgstr "" +#~ "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik " +#~ "alsjeblieft dsmr_backend" #~ msgid "Polls the serial port for DSMR telegram and performs a reading." #~ msgstr "Controleert de seriele poort voor DSMR-gegevens en leest deze uit." #~ msgid "COM-port connected to Smartmeter (default: %(default)s)" -#~ msgstr "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" - -#~ msgid "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_datalogger" -#~ msgstr "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_datalogger" - -#~ msgid "Your current trends and statistics settings do not allow to track trends! You should enable it to have accurate (or any) data below." -#~ msgstr "Je huidige trends- en statistiekeninstellingen staan niet toe om trends bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder te zien." - -#~ msgid "Trends might be recalculated retroactively, depending on whether all historic DSMR source readings are still available." -#~ msgstr "Trends kunnen met terugwerkende kracht berekend worden, mits alle historische DSMR-uitlezingen nog beschikbaar zijn." +#~ msgstr "" +#~ "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" + +#~ msgid "" +#~ "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please " +#~ "use dsmr_datalogger" +#~ msgstr "" +#~ "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik " +#~ "alsjeblieft dsmr_datalogger" + +#~ msgid "" +#~ "Your current trends and statistics settings do not allow to track trends! " +#~ "You should enable it to have accurate (or any) data below." +#~ msgstr "" +#~ "Je huidige trends- en statistiekeninstellingen staan niet toe om trends " +#~ "bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder " +#~ "te zien." + +#~ msgid "" +#~ "Trends might be recalculated retroactively, depending on whether all " +#~ "historic DSMR source readings are still available." +#~ msgstr "" +#~ "Trends kunnen met terugwerkende kracht berekend worden, mits alle " +#~ "historische DSMR-uitlezingen nog beschikbaar zijn." #~ msgid "Track trends" #~ msgstr "Houd trends bij" -#~ msgid "Whether we should track trends by storing daily consumption summaries." -#~ msgstr "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." +#~ msgid "" +#~ "Whether we should track trends by storing daily consumption summaries." +#~ msgstr "" +#~ "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." #~ msgid "Trends & statistics configuration" #~ msgstr "Trends- & statistiekenconfiguratie" @@ -1009,14 +1236,21 @@ msgstr "Engels" #~ msgid "Value" #~ msgstr "Waarde" -#~ msgid "This page displays all settings and the status of them. You can change them here" -#~ msgstr "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je kunt ze hier veranderen" +#~ msgid "" +#~ "This page displays all settings and the status of them. You can change " +#~ "them here" +#~ msgstr "" +#~ "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je " +#~ "kunt ze hier veranderen" #~ msgid "BAUD rate" #~ msgstr "BAUD-waarde" -#~ msgid "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" -#~ msgstr "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 voor oudere versies" +#~ msgid "" +#~ "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" +#~ msgstr "" +#~ "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 " +#~ "voor oudere versies" #~ msgid "GRAPH_SHORT_DATETIME l, P" #~ msgstr "GRAPH_SHORT_DATETIME l G:i" @@ -1030,8 +1264,16 @@ msgstr "Engels" #~ msgid "Miscellaneous statistics" #~ msgstr "Overige statistieken" -#~ msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." -#~ msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor hoogtarief." +#~ msgid "" +#~ "Tariff indicator electricity. The tariff indicator can be used to switch " +#~ "tariff dependent loads e.g boilers. This is responsibility of the P1 " +#~ "user. Note: Tariff code 1 is used for low tariff and tariff code 2 is " +#~ "used for normal tariff." +#~ msgstr "" +#~ "Tariefindicatie. Dit kan gebruikt worden om te wisselen met " +#~ "tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording " +#~ "is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " +#~ "daltarief en tariefcode 2 voor hoogtarief." #~ msgid "Electricity 2" #~ msgstr "Elektriciteit 2" From 13d042edfac494510b1c313f647d5b2a9573b53f Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Wed, 4 May 2016 23:43:32 +0200 Subject: [PATCH 08/13] Display average temperature in archive #122 --- docs/changelog.rst | 1 + dsmr_consumption/services.py | 9 ++++- .../templates/dsmr_frontend/archive.html | 29 +++++++------- .../templates/dsmr_frontend/dashboard.html | 6 +-- .../fragments/archive-xhr-statistics.html | 16 +++++++- .../0006_min_max_temperature_statistics.py | 24 ++++++++++++ ..._max_temperature_statistics_retroactive.py | 36 ++++++++++++++++++ dsmr_stats/models/statistics.py | 6 +++ dsmr_stats/services.py | 9 ++++- dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 26322 -> 26567 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 25 +++++++++--- 12 files changed, 134 insertions(+), 29 deletions(-) create mode 100644 dsmr_stats/migrations/0006_min_max_temperature_statistics.py create mode 100644 dsmr_stats/migrations/0007_min_max_temperature_statistics_retroactive.py diff --git a/docs/changelog.rst b/docs/changelog.rst index f4566dc80..c51a8c908 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -9,6 +9,7 @@ v1.2.0 - 2016-xx-xx - Force backup (`#123 `_). - Update clean-install.md (`#131 `_). - Improve data export field names (`#132 `_). +- Display average temperature in archive (`#122 `_). v1.1.2 - 2016-05-01 diff --git a/dsmr_consumption/services.py b/dsmr_consumption/services.py index e40661681..1a6e4b4b2 100644 --- a/dsmr_consumption/services.py +++ b/dsmr_consumption/services.py @@ -3,8 +3,7 @@ import pytz from django.utils import timezone -from django.db import connection -from django.db.models import Avg, Max +from django.db.models import Avg, Min, Max from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption from dsmr_consumption.models.settings import ConsumptionSettings @@ -186,6 +185,12 @@ def day_consumption(day): temperature_readings = TemperatureReading.objects.filter( read_at__gte=day_start, read_at__lt=day_end, ).order_by('read_at') + consumption['lowest_temperature'] = temperature_readings.aggregate( + avg_temperature=Min('degrees_celcius'), + )['avg_temperature'] or 0 + consumption['highest_temperature'] = temperature_readings.aggregate( + avg_temperature=Max('degrees_celcius'), + )['avg_temperature'] or 0 consumption['average_temperature'] = temperature_readings.aggregate( avg_temperature=Avg('degrees_celcius'), )['avg_temperature'] or 0 diff --git a/dsmr_frontend/templates/dsmr_frontend/archive.html b/dsmr_frontend/templates/dsmr_frontend/archive.html index 1d420309d..bf99ddfbb 100644 --- a/dsmr_frontend/templates/dsmr_frontend/archive.html +++ b/dsmr_frontend/templates/dsmr_frontend/archive.html @@ -59,10 +59,10 @@
-
- - - + + + + - + + + + - + + + + {% endif %} - + {% endblock %} {% block stylesheets %} @@ -356,5 +356,6 @@ ctx.canvas.height = $("#gas-chart").parent().height(); g_gas_chart_instance = new Chart(ctx).Line(data, line_options); } - + + {% endblock %} \ No newline at end of file diff --git a/dsmr_frontend/templates/dsmr_frontend/dashboard.html b/dsmr_frontend/templates/dsmr_frontend/dashboard.html index c743f9601..00f6fe8be 100644 --- a/dsmr_frontend/templates/dsmr_frontend/dashboard.html +++ b/dsmr_frontend/templates/dsmr_frontend/dashboard.html @@ -329,9 +329,9 @@ datasets: [{ data: {{ temperature_y|safe }}, label: "{% trans 'Temperature' %}", - fillColor: "rgba(35,183,229,0.1)", - strokeColor: "rgba(35,183,229,1)", - pointColor: "rgba(35,183,229,1)", + fillColor: "rgba(0,115,183,0.1)", + strokeColor: "rgba(0,115,183,1)", + pointColor: "rgba(0,115,183,1)", pointStrokeColor: "#fff", pointHighlightFill: "#fff", pointHighlightStroke: "rgba(150,150,150,1)" diff --git a/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html b/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html index fc6616a55..fc765d86b 100644 --- a/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html +++ b/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html @@ -39,16 +39,28 @@ {% if capabilities.gas %}{% trans "Gas" %}{% endif %} - {% if capabilities.gas %}{{ statistics.gas|default:'-' }}{% endif %} + {% if capabilities.gas %}{{ statistics.gas|default:'-' }}{% endif %}   {% if energy_price %}{{ energy_price.gas_price|default:'-' }}{% endif %} - {% if capabilities.gas %}{{ statistics.gas_cost|default:'-' }}{% endif %} + {% if capabilities.gas %}{{ statistics.gas_cost|default:'-' }}{% endif %} {% trans "Total" %}   {{ statistics.total_cost|default:'-' }} + {% if statistics.temperature_avg %} + +   + + + {% trans "Weather" %} + {% trans "Min." %}   {{ statistics.temperature_min|floatformat|default:'-' }} °C + {% trans "Max." %}   {{ statistics.temperature_max|floatformat|default:'-' }} °C +   + {% trans "Avg." %}   {{ statistics.temperature_avg|floatformat|default:'-' }} °C + + {% endif %} {% if notes %} diff --git a/dsmr_stats/migrations/0006_min_max_temperature_statistics.py b/dsmr_stats/migrations/0006_min_max_temperature_statistics.py new file mode 100644 index 000000000..a786011c4 --- /dev/null +++ b/dsmr_stats/migrations/0006_min_max_temperature_statistics.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dsmr_stats', '0005_statistics_exportverbose_names'), + ] + + operations = [ + migrations.AddField( + model_name='daystatistics', + name='highest_temperature', + field=models.DecimalField(decimal_places=1, max_digits=4, verbose_name='Highest temperature', default=None, null=True), + ), + migrations.AddField( + model_name='daystatistics', + name='lowest_temperature', + field=models.DecimalField(decimal_places=1, max_digits=4, verbose_name='Lowest temperature', default=None, null=True), + ), + ] diff --git a/dsmr_stats/migrations/0007_min_max_temperature_statistics_retroactive.py b/dsmr_stats/migrations/0007_min_max_temperature_statistics_retroactive.py new file mode 100644 index 000000000..27a36662c --- /dev/null +++ b/dsmr_stats/migrations/0007_min_max_temperature_statistics_retroactive.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations +from django.db.models import Q + + +def regenerate_data(apps, schema_editor): + DayStatistics = apps.get_model('dsmr_stats', 'DayStatistics') + + # Only when we have at least one temperature reading which was not zero. + if not DayStatistics.objects.filter(~Q(average_temperature=0)).exists(): + return + + print('') + + day_count = DayStatistics.objects.all().count() + DayStatistics.objects.all().delete() + + import dsmr_stats.services + + for x in range(1, day_count + 1): + # Just call analyze for each day. If we missed a day or so, the backend will regenerate it. + print('Regenerating day: {} / {}'.format(x, day_count)) + dsmr_stats.services.analyze() + + +class Migration(migrations.Migration): + + dependencies = [ + ('dsmr_stats', '0006_min_max_temperature_statistics'), + ] + + operations = [ + migrations.RunPython(regenerate_data) + ] diff --git a/dsmr_stats/models/statistics.py b/dsmr_stats/models/statistics.py index 9ad342d74..f392c82eb 100644 --- a/dsmr_stats/models/statistics.py +++ b/dsmr_stats/models/statistics.py @@ -35,6 +35,12 @@ class DayStatistics(models.Model): ) # Temperature readings depend on user settings. + lowest_temperature = models.DecimalField( + max_digits=4, decimal_places=1, null=True, default=None, verbose_name=_('Lowest temperature') + ) + highest_temperature = models.DecimalField( + max_digits=4, decimal_places=1, null=True, default=None, verbose_name=_('Highest temperature') + ) average_temperature = models.DecimalField( max_digits=4, decimal_places=1, null=True, default=None, verbose_name=_('Average temperature') ) diff --git a/dsmr_stats/services.py b/dsmr_stats/services.py index 773f66779..bd7f58976 100644 --- a/dsmr_stats/services.py +++ b/dsmr_stats/services.py @@ -3,7 +3,7 @@ from dateutil.relativedelta import relativedelta from django.db import transaction, connection -from django.db.models.aggregates import Avg, Sum +from django.db.models.aggregates import Avg, Sum, Min, Max from django.core.cache import cache from django.utils import timezone from django.conf import settings @@ -106,7 +106,9 @@ def create_daily_statistics(day): gas=consumption.get('gas', 0), gas_cost=consumption.get('gas_cost', 0), - average_temperature=consumption.get('average_temperature', 0), + lowest_temperature=consumption.get('lowest_temperature'), + highest_temperature=consumption.get('highest_temperature'), + average_temperature=consumption.get('average_temperature'), ) @@ -204,6 +206,9 @@ def range_statistics(start, end): electricity2_returned=Sum('electricity2_returned'), gas=Sum('gas'), gas_cost=Sum('gas_cost'), + temperature_min=Min('lowest_temperature'), + temperature_max=Max('highest_temperature'), + temperature_avg=Avg('average_temperature'), ) diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index c14854127..e5ec92717 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 5) +VERSION = (1, 2, 0, 'beta', 6) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index a82a0a881c4718b9515ae23e27ff8bb87fceb0e7..0876c079374674533439799c4ede59ad26c138dd 100644 GIT binary patch delta 6047 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 diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index b2d92e16c..03b603291 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-04 21:56+0200\n" -"PO-Revision-Date: 2016-05-04 21:53+0100\n" +"POT-Creation-Date: 2016-05-04 23:43+0200\n" +"PO-Revision-Date: 2016-05-04 23:41+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -480,6 +480,18 @@ msgstr "Voeg notitie toe voor deze datum" msgid "Energy price" msgstr "Energieprijs" +msgid "Weather" +msgstr "Weergegevens" + +msgid "Min." +msgstr "Min." + +msgid "Max." +msgstr "Max." + +msgid "Avg." +msgstr "Gem." + msgid "Meter positions" msgstr "Meterstanden" @@ -625,15 +637,18 @@ msgstr "Totale kosten" msgid "Electricity 2 returned (high tariff)" msgstr "Elektriciteit 2 teruggeleverd (piektarief)" +msgid "Lowest temperature" +msgstr "Laagste temperatuur" + +msgid "Highest temperature" +msgstr "Hoogste temperatuur" + msgid "Average temperature" msgstr "Gemiddelde temperatuur" msgid "Hour start" msgstr "Begintijd uur" -msgid "Weather" -msgstr "Weergegevens" - msgid "Weather station Arcen" msgstr "Weerstation Arcen" From 1d0c8cf5a72746eafca0348010bd065ee30b2b00 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Thu, 5 May 2016 00:03:29 +0200 Subject: [PATCH 09/13] Pie charts on trends page overlap their canvas #136 --- docs/changelog.rst | 1 + .../templates/dsmr_frontend/trends.html | 4 +- dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 52858 -> 26633 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 479 +++++------------- 5 files changed, 124 insertions(+), 362 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index c51a8c908..e35c431fb 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -10,6 +10,7 @@ v1.2.0 - 2016-xx-xx - Update clean-install.md (`#131 `_). - Improve data export field names (`#132 `_). - Display average temperature in archive (`#122 `_). +- Pie charts on trends page overlap their canvas (`#136 `_). v1.1.2 - 2016-05-01 diff --git a/dsmr_frontend/templates/dsmr_frontend/trends.html b/dsmr_frontend/templates/dsmr_frontend/trends.html index b3256ba0b..a1b23a37b 100644 --- a/dsmr_frontend/templates/dsmr_frontend/trends.html +++ b/dsmr_frontend/templates/dsmr_frontend/trends.html @@ -68,7 +68,7 @@ {% if capabilities.electricity %}
-
+
{% blocktrans %}Electricity tariff ratio (passed week){% endblocktrans %}
@@ -81,7 +81,7 @@
-
+
{% blocktrans %}Electricity tariff ratio (passed month){% endblocktrans %}
diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index e5ec92717..c7da06447 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 6) +VERSION = (1, 2, 0, 'beta', 7) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index 37dc5cb53ac6708ecb7ea41fe7f6c7edbb3c2ea6..d7c14b2896742c76b879f50aab103ea4769e09ab 100644 GIT binary patch delta 4069 zcmXZe2~bs49LMqVKzN9#5W77A5fcRx1vSA@vw}2yijqbdl7&bZmJ3QYbJHA6O>3l_ zHVP{WIFIcNqtFYBu@Yl&1!|%PQ42ng3gK4NiMOL7_K|ZxPNIGUD=oYsCA09xR;2bJKF*Fiw zGYFL{LDWJwqaxdYUGN@M1eW4>);FKHh9qX8!AwVmb~7sZcA*~p7^CrX)J6~B9L(UJ zX5kvtxKkK~XK^5&M~0f*TzjPxaWwTs7xh?x0*5eXaU=!?SgUa;^$n;y{0z0gHyDH8 zA;B`ooUyD%uuK8+!k9{&fK90JVbt630V?9(VLa=bGZd6OelA2Ey-}eaib}>Qn1!>E zd^D?&AG3vDemsae@llM$PK?Gsu?kP4a%_CQjoebaminjY9jA~~VDHLzxm~b3j-x#r zkNXHSZlYdYXs_e~Hc^isY!~#flKN^a$8S;NbB5St+=B_!Q;Y0I2cR}OsEGSlmX^?< zY!9N6sty})J}P;RqE2)Y_25}lWFmNFf|!b0U>556#h8vOP*>KDiqs}lq+fErS4{l1 z@HaH*Zcd`Epeq+I`=CBFBTy4oVInr6u4ozR1JjPm{xE9X5$9=4rrwkItGyp);b_#n zwVvx(f=Z@GP!sNU0}fyc^%JNKMh~|e%S25$95qp;a}H|UN>mcIyY@Fx;}5y^Q>X)Y zJ+H7G1*q&TM=jWhX}Aovz!R>%6V?BP^HOH=e~vd>NGs9jNcgJJ?1t z??b(gO{0`s-2Wm9*U+#U%Wxl###DY~;WSjJ7UO2zfJ(MeV{B4QLVc)iK+?xFAZIX7 zVJ;p*MZ$NbO~y3TMtfs7k3ud5Wp^NEQIU8RlW+%WgL^OoFQBIdGl;Jq9E_=0irsJu#^DUtKL-`MW>i*t*aIJNK8HF; z2=Bl*a4zOvZOjsU6g7Vm;ns8c*ARa`LZ*}kop?5C;k%tHPJNof8yb;4#gQ=DLp~7ZV|L>^CoWeo)FXmt#t13q(A-7=WNxlDJ z*AdO})sgF*hx(9&QK377TA)jnT_6rMaWW3X5>y20T>Jf~jlP6>KIVEG!4%X+hM=b` zucDBMjhKWUX5quAoY;XHw-@!`FIa?rGFNw5ib~2djKd04@>SzPti@sY71m<+X*S|b z(|G^?q2Wy$y5Y_n>;~RN#+t9OJc9eK=D!^3&1BdmSTWt0yKn~TWczV0evidC@n&P% zaXIp+>Bl|wLJzgE$5GF1tRem>6t=qoA7V1~AF&0`y82x+?1L*Yf%bK%NVVe}+<}T< zcCGzj4MQbs87g;Xq9Rj|X}AD2&svXyPV_Wt!Vc6#A32YpHh2QHvFKau0s%~?o{xGR z%TOn*L5*v1K8RXqldJE-0QJvN^LoF#4&O}sM{A{-PvhpLY*;%)C-W0mZ`x-xD~fz_ALGZ z^$|*pqQ0-*-tku$Nxc)5WXDhuJKZ{F!l%CC*0|ud2%oR@_27nxA`_~dIEqO^4^;;J zq0~TURH(hCxmU{Mx;y92TTn1zetpAj1!EW1&o8K&TawlKPD@|k6|HMpa=I3k6c5fT i99&o!8hv+)FEn$>wusP@&3(Is@|JCh4qevKFYrID=kZJc delta 10095 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 W4@fO%fQ)=b_xqF6BL1(TNBkG-uc_1k diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index 630662bb5..2ba4e9251 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-04 23:43+0200\n" +"POT-Creation-Date: 2016-05-04 23:48+0200\n" "PO-Revision-Date: 2016-05-04 23:41+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" @@ -21,18 +21,11 @@ msgstr "" msgid "Backend" msgstr "Achterkant" -msgid "" -"Unsupported database engine \"{}\" active, some features might not work " -"properly" -msgstr "" -"De database engine \"{}\" wordt niet actief ondersteund, sommige functies " -"werken hierdoor mogelijk minder goed" +msgid "Unsupported database engine \"{}\" active, some features might not work properly" +msgstr "De database engine \"{}\" wordt niet actief ondersteund, sommige functies werken hierdoor mogelijk minder goed" -msgid "" -"Generates a generic event triggering apps for backend operations, cron-like." -msgstr "" -"Genereert een generiek signaal dat gebruikt kan worden door plugins voor " -"achtergrondoperaties, zoals cron." +msgid "Generates a generic event triggering apps for backend operations, cron-like." +msgstr "Genereert een generiek signaal dat gebruikt kan worden door plugins voor achtergrondoperaties, zoals cron." msgid "Forces single run, overriding Infinite Command mixin" msgstr "Forceert enkele uitvoer." @@ -43,45 +36,26 @@ msgstr "Backup" msgid "Backup daily" msgstr "Dagelijkse backup" -msgid "" -"Create a backup of your data daily. Stored locally, but can be exported " -"using Dropbox." -msgstr "" -"Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan " -"geexporteerd worden via Dropbox." +msgid "Create a backup of your data daily. Stored locally, but can be exported using Dropbox." +msgstr "Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan geexporteerd worden via Dropbox." msgid "Compress" msgstr "Comprimeren" -msgid "" -"Create backups in compressed (gzip) format, saving a significant amount of " -"disk space." -msgstr "" -"Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke " -"hoeveelheid schijfruimte bespaard wordt." +msgid "Create backups in compressed (gzip) format, saving a significant amount of disk space." +msgstr "Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke hoeveelheid schijfruimte bespaard wordt." msgid "Backup timestamp" msgstr "Tijdstip van backup" -msgid "" -"Daily moment of creating the backup. You should prefer a nightly timestamp, " -"as it might freeze or lock the application shortly during backup creation." -msgstr "" -"Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de " -"nacht te pakken, gezien het maken van een backup de werking van de " -"applicatie kort kan onderbreken." +msgid "Daily moment of creating the backup. You should prefer a nightly timestamp, as it might freeze or lock the application shortly during backup creation." +msgstr "Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de nacht te pakken, gezien het maken van een backup de werking van de applicatie kort kan onderbreken." msgid "Latest backup" msgstr "Meest recente backup" -msgid "" -"Timestamp of latest backup created. Automatically updated by application. " -"Please note that the application will ignore the \"backup_time\" setting the " -"first time used." -msgstr "" -"Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. " -"N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer " -"genegeerd!" +msgid "Timestamp of latest backup created. Automatically updated by application. Please note that the application will ignore the \"backup_time\" setting the first time used." +msgstr "Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer genegeerd!" msgid "Backup configuration" msgstr "Backupconfiguratie" @@ -89,32 +63,14 @@ msgstr "Backupconfiguratie" msgid "Dropbox access token" msgstr "Dropbox 'access token'" -msgid "" -"The access token for your Dropbox account. You should register an App for " -"your own Dropbox account (https://www.dropbox.com/developers/apps). Please " -"select \"Permission type\" named \"App folder\" to restrict unneeded access. " -"Backups will be synced to a dedicated folder in your account. After creating " -"your App you should be able to generate an \"Access token\" and enter it " -"here. For more information, see https://blogs.dropbox.com/developers/2014/05/" -"generate-an-access-token-for-your-own-account" -msgstr "" -"Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen " -"account een applicatie registeren (https://www.dropbox.com/developers/apps). " -"Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder" -"\" om de gedeelde toegang tot je account te beperken. Backups worden " -"hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox " -"een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" " -"genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox." -"com/developers/2014/05/generate-an-access-token-for-your-own-account" +msgid "The access token for your Dropbox account. You should register an App for your own Dropbox account (https://www.dropbox.com/developers/apps). Please select \"Permission type\" named \"App folder\" to restrict unneeded access. Backups will be synced to a dedicated folder in your account. After creating your App you should be able to generate an \"Access token\" and enter it here. For more information, see https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" +msgstr "Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen account een applicatie registeren (https://www.dropbox.com/developers/apps). Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder\" om de gedeelde toegang tot je account te beperken. Backups worden hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" msgid "Latest sync" msgstr "Meest recente synchronisatie" -msgid "" -"Timestamp of latest sync with Dropbox. Automatically updated by application." -msgstr "" -"Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit " -"automatisch bij." +msgid "Timestamp of latest sync with Dropbox. Automatically updated by application." +msgstr "Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit automatisch bij." msgid "Dropbox configuration" msgstr "Dropbox-configuratie" @@ -123,26 +79,16 @@ msgid "Consumption" msgstr "Verbruik" msgid "Meter Reading electricity delivered to client (low tariff) in 0,001 kWh" -msgstr "" -"Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt " -"uur" +msgstr "Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt uur" msgid "Meter Reading electricity delivered by client (low tariff) in 0,001 kWh" -msgstr "" -"Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 " -"Watt uur" +msgstr "Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 Watt uur" -msgid "" -"Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" -msgstr "" -"Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt " -"uur" +msgid "Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" +msgstr "Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt uur" -msgid "" -"Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" -msgstr "" -"Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 " -"Watt uur" +msgid "Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" +msgstr "Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 Watt uur" msgid "Actual electricity power delivered (+P) in 1 Watt resolution" msgstr "Daadwerkelijk geleverde elektriciteit geleverd (-P) in 1 Watt stappen" @@ -172,8 +118,7 @@ msgid "Description" msgstr "Omschrijving" msgid "For your own reference, i.e. the name of your supplier" -msgstr "" -"Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" +msgstr "Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" msgid "Electricity 1 price (low tariff)" msgstr "Prijs elektriciteit 1 (daltarief)" @@ -202,11 +147,8 @@ msgstr "Per minuut" msgid "Compactor grouping type" msgstr "Metingen groeperen" -msgid "" -"Electricity readings are read every 10 seconds. We can group those for you." -msgstr "" -"Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je " -"groeperen." +msgid "Electricity readings are read every 10 seconds. We can group those for you." +msgstr "Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je groeperen." msgid "Consumption configuration" msgstr "Verbruiksconfiguratie" @@ -217,18 +159,11 @@ msgstr "Datalogger" msgid "Performs an DSMR P1 telegram reading on the COM port." msgstr "Leest een DSMR P1 telegram uit van de COM-poort (meting)." -msgid "" -"Generates a FAKE reading. DO NOT USE in production! Used for integration " -"checks." -msgstr "" -"Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor " -"integratietests." +msgid "Generates a FAKE reading. DO NOT USE in production! Used for integration checks." +msgstr "Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor integratietests." -msgid "" -"Required option to acknowledge you that you WILL mess up your data with this." -msgstr "" -"Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data " -"kan verprutsen." +msgid "Required option to acknowledge you that you WILL mess up your data with this." +msgstr "Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data kan verprutsen." msgid "Include gas consumption" msgstr "Neem gasverbruik mee" @@ -236,11 +171,8 @@ msgstr "Neem gasverbruik mee" msgid "Include electricity returned (solar panels)" msgstr "neem teruglevering elektriciteit mee (zonnepanelen)" -msgid "" -"Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" -msgstr "" -"Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-" -"my-data" +msgid "Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" +msgstr "Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-my-data" msgid "Timestamp indicating when the reading was taken, according to the meter" msgstr "Moment waarop de meting is gedaan, volgens de meter." @@ -249,22 +181,13 @@ msgid "Last hourly reading timestamp" msgstr "Tijdstip van laatste meting" msgid "Whether this reading has been processed for merging into statistics" -msgstr "" -"Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" +msgstr "Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" msgid "DSMR reading" msgstr "DSMR-meting" -msgid "" -"Tariff indicator electricity. The tariff indicator can be used to switch " -"tariff dependent loads e.g boilers. This is responsibility of the P1 user. " -"Note: Tariff code 1 is used for low tariff and tariff code 2 is used for " -"normal tariff." -msgstr "" -"Tariefindicatie. Dit kan gebruikt worden om te wisselen met " -"tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is " -"voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " -"daltarief en tariefcode 2 voor piektarief." +msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." +msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor piektarief." msgid "Number of power failures in any phases" msgstr "Aantal stroomstoringen in alle fases" @@ -276,23 +199,19 @@ msgid "Number of voltage sags/dips in phase L1" msgstr "Aantal spanningsdippen in fase L1" msgid "Number of voltage sags/dips in phase L2 (polyphase meters only)" -msgstr "" -"Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage sags/dips in phase L3 (polyphase meters only)" -msgstr "" -"Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L1" msgstr "Aantal spanningspieken in fase L1" msgid "Number of voltage swells in phase L2 (polyphase meters only)" -msgstr "" -"Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L3 (polyphase meters only)" -msgstr "" -"Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" msgid "DSMR Meter statistics" msgstr "Meterstatistieken" @@ -306,36 +225,20 @@ msgstr "DSMR-versie 2/3" msgid "Poll P1 port" msgstr "Peil P1 poort" -msgid "" -"Whether we should track the P1 port on your smartmeter. Almost every feature " -"inside this project requires this to be enabled. However, it might be " -"disabled temporarily due to technical reasons, such as data migrations." -msgstr "" -"Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke " -"functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan " -"desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, " -"zoals datamigraties (bij updates)." +msgid "Whether we should track the P1 port on your smartmeter. Almost every feature inside this project requires this to be enabled. However, it might be disabled temporarily due to technical reasons, such as data migrations." +msgstr "Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, zoals datamigraties (bij updates)." msgid "Track meter statistics" msgstr "Houd meterstatistieken bij" -msgid "" -"Whether we should track any extra statistics sent by the meter, such as the " -"number of power failures of voltage dips. Data is not required for core " -"features." -msgstr "" -"Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal " -"stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de " -"basisfunctionaliteit." +msgid "Whether we should track any extra statistics sent by the meter, such as the number of power failures of voltage dips. Data is not required for core features." +msgstr "Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de basisfunctionaliteit." msgid "DSMR version" msgstr "DSMR-versie" -msgid "" -"The DSMR version your meter supports. Version should be printed on meter." -msgstr "" -"De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op " -"de meter." +msgid "The DSMR version your meter supports. Version should be printed on meter." +msgstr "De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op de meter." msgid "COM-port" msgstr "COM-poort" @@ -373,11 +276,8 @@ msgstr "Weergaveconfiguratie" msgid "Archive" msgstr "Archief" -msgid "" -"No data found. It can take up to one day before any data is visible here." -msgstr "" -"Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer " -"gegevens zichtbaar." +msgid "No data found. It can take up to one day before any data is visible here." +msgstr "Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer gegevens zichtbaar." msgid "Select level of detail displayed" msgstr "Selecteer detailniveau" @@ -463,12 +363,8 @@ msgstr "Bekijk repository op Github" msgid "Theme created by" msgstr "Thema gemaakt door" -msgid "" -"No data found. Please make sure the datalogger is up and running and the " -"backend process is running as well." -msgstr "" -"Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het " -"achtergrondproces." +msgid "No data found. Please make sure the datalogger is up and running and the backend process is running as well." +msgstr "Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het achtergrondproces." msgid "Base selection" msgstr "Basisselectie" @@ -482,12 +378,8 @@ msgstr "Alle instellingen" msgid "Setting" msgstr "Instelling" -msgid "" -"This will simply alter the latest backup timestamp displayed above to a week " -"ago." -msgstr "" -"Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up " -"een week in het verleden wordt gezet." +msgid "This will simply alter the latest backup timestamp displayed above to a week ago." +msgstr "Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up een week in het verleden wordt gezet." msgid "Schedule new backup now" msgstr "Plan per direct nieuwe back-up in" @@ -549,20 +441,14 @@ msgstr "Selecteer het soort gegevens dat je wil exporteren." msgid "Day totals" msgstr "Dagtotalen" -msgid "" -"Summary of each day. Contains electricity, gas and costs (if applicable)." -msgstr "" -"Samenvatting van elke dag. Bevat electriciteit, gas en gemaakte kosten " -"(wanneer van toepassing)." +msgid "Summary of each day. Contains electricity, gas and costs (if applicable)." +msgstr "Samenvatting van elke dag. Bevat electriciteit, gas en gemaakte kosten (wanneer van toepassing)." msgid "Hour totals" msgstr "Uurtotalen" -msgid "" -"Summary of each hour read. Contains electricity and gas (if applicable)." -msgstr "" -"Samenvatting van elk uur. Bevat electriciteit en gas (wanneer van " -"toepassing)." +msgid "Summary of each hour read. Contains electricity and gas (if applicable)." +msgstr "Samenvatting van elk uur. Bevat electriciteit en gas (wanneer van toepassing)." msgid "Select date range start" msgstr "Selecteer startdatum" @@ -586,9 +472,7 @@ msgid "Excel (.CSV)" msgstr "Excel (.CSV)" msgid "Exports the data in Comma Separated Format, which can be read by Excel." -msgstr "" -"Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door " -"Excel." +msgstr "Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door Excel." msgid "Add note for this date" msgstr "Voeg notitie toe voor deze datum" @@ -620,12 +504,8 @@ msgstr "Gas" msgid "Meter statistics" msgstr "Meterstatistieken" -msgid "" -"Tracking meter statistics is disabled. Enable this feature in the datalogger " -"settings to view statistics." -msgstr "" -"Meterstatistieken worden niet bijgehouden. Schakel dit bij de " -"dataloggerinstellingen in om de statistieken weer te geven." +msgid "Tracking meter statistics is disabled. Enable this feature in the datalogger settings to view statistics." +msgstr "Meterstatistieken worden niet bijgehouden. Schakel dit bij de dataloggerinstellingen in om de statistieken weer te geven." msgid "Current energy prices" msgstr "Huidige energietarieven" @@ -642,12 +522,8 @@ msgstr "Elektriciteit 2 (per kWh)" msgid "Gas (per m3)" msgstr "Gas (per m3)" -msgid "" -"No energy supplier prices found for today. Enable this feature in " -"consumption settings to view prices." -msgstr "" -"Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de " -"verbruiksinstellingen om de prijzen weer te geven." +msgid "No energy supplier prices found for today. Enable this feature in consumption settings to view prices." +msgstr "Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de verbruiksinstellingen om de prijzen weer te geven." msgid "DSMR-reader" msgstr "DSMR-reader" @@ -667,12 +543,8 @@ msgstr "Metingen" msgid "Status regarding the latest data read from your meter." msgstr "Voortgang m.b.t. de meest recente gevens uit je meter." -msgid "" -"It has been a while since the latest meter reading. Your datalogger " -"process might hang or has been crashed." -msgstr "" -"De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het " -"datalogger proces of is deze gecrashed." +msgid "It has been a while since the latest meter reading. Your datalogger process might hang or has been crashed." +msgstr "De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het datalogger proces of is deze gecrashed." msgid "Latest reading" msgstr "Laatste meting" @@ -686,53 +558,32 @@ msgstr "Totaal aantal metingen" msgid "Background" msgstr "Achtergrond" -msgid "" -"Status regarding processing readings, making them visible in other pages and " -"graphs." -msgstr "" -"Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze " -"zichtbaar zijn in andere pagina's en grafieken." +msgid "Status regarding processing readings, making them visible in other pages and graphs." +msgstr "Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze zichtbaar zijn in andere pagina's en grafieken." msgid "Unprocessed readings" msgstr "Onverwerkte metingen" -msgid "" -"There are too many unprocessed readings. Your backend process might hang or has been crashed." -msgstr "" -"Er zijn te veel onverwerkte metingen. Mogelijk hangt het " -"achtergrondproces of is deze gecrashed." +msgid "There are too many unprocessed readings. Your backend process might hang or has been crashed." +msgstr "Er zijn te veel onverwerkte metingen. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest electricity consumption tracked" msgstr "Meest recente electriciteitsverbruik verwerkt" -msgid "" -"It has been a while since electricity consumption was tracked. Your " -"backend process might hang or has been crashed." -msgstr "" -"Het meest recente electriciteitsverbruik is een tijdje geleden verwerkt. " -"Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "It has been a while since electricity consumption was tracked. Your backend process might hang or has been crashed." +msgstr "Het meest recente electriciteitsverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest gas consumption tracked" msgstr "Meest recente gasverbruik verwerkt" -msgid "" -"It has been a while since gas consumption was tracked. Your backend " -"process might hang or has been crashed." -msgstr "" -"Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt " -"het achtergrondproces of is deze gecrashed." +msgid "It has been a while since gas consumption was tracked. Your backend process might hang or has been crashed." +msgstr "Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Data availability" msgstr "Beschikbaarheid gegevens" -msgid "" -"Based on readings until this moment. Electricity usage should be always " -"available. Gas usage and electricity return depend on your home situation." -msgstr "" -"Gebaseerd op verwerkte uitlezingen tot nu toe. Electriciteitsverbruik zou " -"altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering " -"hangen af van je thuissituatie." +msgid "Based on readings until this moment. Electricity usage should be always available. Gas usage and electricity return depend on your home situation." +msgstr "Gebaseerd op verwerkte uitlezingen tot nu toe. Electriciteitsverbruik zou altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering hangen af van je thuissituatie." msgid "Data type" msgstr "Soort gegevens" @@ -743,21 +594,12 @@ msgstr "Gemeten" msgid "Electricity return" msgstr "Elektriciteitsteruglevering" -msgid "" -"All data below is calculated among all consumption tracked until a day ago. " -"Untracked consumption and any usage of today is not taken into account." -msgstr "" -"Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en " -"met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin " -"niet meegenomen." +msgid "All data below is calculated among all consumption tracked until a day ago. Untracked consumption and any usage of today is not taken into account." +msgstr "Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin niet meegenomen." #, python-format -msgid "" -"Current data displayed averages %(hour_statistics_count)s hour(s), among " -"%(day_statistics_count)s day(s)." -msgstr "" -"Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, " -"verdeeld over %(day_statistics_count)s dag(en)." +msgid "Current data displayed averages %(hour_statistics_count)s hour(s), among %(day_statistics_count)s day(s)." +msgstr "Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, verdeeld over %(day_statistics_count)s dag(en)." #, python-format msgid "Average hourly electricity consumed (in %%)" @@ -969,24 +811,14 @@ msgstr "Temperatuur (in ℃)" msgid "Track weather" msgstr "Houd weergegevens bij" -msgid "" -"Whether we should track and log outside temperatures using an external " -"service. Current service integrated is Buienradar" -msgstr "" -"Geeft aan of we buitentemperaturen meten via een externe dienst, en ze " -"bijhouden. Huidig gebruikte dienst is Buienradar" +msgid "Whether we should track and log outside temperatures using an external service. Current service integrated is Buienradar" +msgstr "Geeft aan of we buitentemperaturen meten via een externe dienst, en ze bijhouden. Huidig gebruikte dienst is Buienradar" msgid "Buienradar weather station" msgstr "Buienradar weerstation" -msgid "" -"The weather station used to measure and log outside temperatures. Choose one " -"nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of " -"all locations." -msgstr "" -"Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te " -"slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www." -"buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." +msgid "The weather station used to measure and log outside temperatures. Choose one nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of all locations." +msgstr "Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www.buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." msgid "Weather configuration" msgstr "Weergegevensconfiguratie" @@ -1016,18 +848,10 @@ msgstr "Engels" #~ msgstr "Bezig met bijwerken/uitrollen van DSMR-reader" #~ msgid "Please note that this may take a while, depending on your device..." -#~ msgstr "" -#~ "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je " -#~ "apparaat..." - -#~ msgid "" -#~ "Info regarding the version of this application. Automatic updates are not " -#~ "available (mostly due to privacy reasons), but you should be able to " -#~ "update manually." -#~ msgstr "" -#~ "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk " -#~ "wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een " -#~ "nieuwere versie." +#~ msgstr "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je apparaat..." + +#~ msgid "Info regarding the version of this application. Automatic updates are not available (mostly due to privacy reasons), but you should be able to update manually." +#~ msgstr "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een nieuwere versie." #~ msgid "Updates" #~ msgstr "Updates" @@ -1054,8 +878,7 @@ msgstr "Engels" #~ msgstr "Weken in recente historie" #~ msgid "The number of weeks displayed in the recent history overview." -#~ msgstr "" -#~ "Het aantal weken dat getoond wordt in het recente historie overzicht." +#~ msgstr "Het aantal weken dat getoond wordt in het recente historie overzicht." #~ msgid "History" #~ msgstr "Geschiedenis" @@ -1081,12 +904,8 @@ msgstr "Engels" #~ msgid "(in °C)" #~ msgstr "(in °C)" -#~ msgid "" -#~ "Weather tracking is currently disabled. Enable this feature in weather " -#~ "settings to view temperatures (read hourly)." -#~ msgstr "" -#~ "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij " -#~ "weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." +#~ msgid "Weather tracking is currently disabled. Enable this feature in weather settings to view temperatures (read hourly)." +#~ msgstr "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." #~ msgid "Electricity 1 cost (low tariff)" #~ msgstr "Elektriciteit 1 kosten (daltarief)" @@ -1100,20 +919,11 @@ msgstr "Engels" #~ msgid "Theme by" #~ msgstr "Thema door" -#~ msgid "" -#~ "Number of times data read from your meter. Should be updated every 15 " -#~ "seconds." -#~ msgstr "" -#~ "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden " -#~ "uitgevoerd moeten worden." - -#~ msgid "" -#~ "Most data is processed with a small delay, but should take no longer than " -#~ "a minute to update. Gas consumption however, is only updated once a hour." -#~ msgstr "" -#~ "De meeste gegevens worden op de achtergrond verwerkt met een kleine " -#~ "vertraging. Echter zou het verwerken daarvan niet langer dan een minuut " -#~ "moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." +#~ msgid "Number of times data read from your meter. Should be updated every 15 seconds." +#~ msgstr "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden uitgevoerd moeten worden." + +#~ msgid "Most data is processed with a small delay, but should take no longer than a minute to update. Gas consumption however, is only updated once a hour." +#~ msgstr "De meeste gegevens worden op de achtergrond verwerkt met een kleine vertraging. Echter zou het verwerken daarvan niet langer dan een minuut moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." #~ msgid "Based on readings until this moment" #~ msgstr "Gebaseerd op metingen tot nu toe" @@ -1125,14 +935,10 @@ msgstr "Engels" #~ msgstr "Gemiddeld verbruik elektriciteit 2 (piektarief) per daguur in kWh" #~ msgid "Average hourly electricity 1 return (low tariff) yield in kWh" -#~ msgstr "" -#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) " -#~ "per daguur in kWh" +#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) per daguur in kWh" #~ msgid "Average hourly electricity 2 return (high tariff) yield in kWh" -#~ msgstr "" -#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 " -#~ "(piektarief) per daguur in kWh" +#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 (piektarief) per daguur in kWh" #~ msgid "Average hourly electricity demand in Watt" #~ msgstr "Gemiddelde elektriciteitsvraag per daguur in Watt" @@ -1147,8 +953,7 @@ msgstr "Engels" #~ msgstr "Dagelijks elektriciteitsverbruik in de afgelopen %(days_ago)s dagen" #~ msgid "Daily electricity returned in the past %(days_ago)s days" -#~ msgstr "" -#~ "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" +#~ msgstr "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" #~ msgid "Daily gas usage in the past %(days_ago)s days" #~ msgstr "Dagelijks gasverbruik in de afgelopen %(days_ago)s dagen" @@ -1183,67 +988,38 @@ msgstr "Engels" #~ msgid "Compacts existing DSMR readings into consumption points." #~ msgstr "Voegt bestaande DSMR uitlezingen samen in verbruiksgegevens." -#~ msgid "" -#~ "The max number of readings to compact this run (default: %(default)s)" -#~ msgstr "" -#~ "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt " -#~ "(standaard: %(default)s)" +#~ msgid "The max number of readings to compact this run (default: %(default)s)" +#~ msgstr "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt (standaard: %(default)s)" #~ msgid "DEPRECATED: Moved to settings in database." #~ msgstr "UITGEFASEERD: Instellingen zijn verplaatst naar de database." -#~ msgid "" -#~ "Purges all consumption data (DELETES IT!) and marks all readings as " -#~ "unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL " -#~ "HISTORIC READINGS!" -#~ msgstr "" -#~ "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle " -#~ "uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van " -#~ "groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" - -#~ msgid "" -#~ "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please " -#~ "use dsmr_backend" -#~ msgstr "" -#~ "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik " -#~ "alsjeblieft dsmr_backend" +#~ msgid "Purges all consumption data (DELETES IT!) and marks all readings as unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL HISTORIC READINGS!" +#~ msgstr "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" + +#~ msgid "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_backend" +#~ msgstr "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_backend" #~ msgid "Polls the serial port for DSMR telegram and performs a reading." #~ msgstr "Controleert de seriele poort voor DSMR-gegevens en leest deze uit." #~ msgid "COM-port connected to Smartmeter (default: %(default)s)" -#~ msgstr "" -#~ "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" - -#~ msgid "" -#~ "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please " -#~ "use dsmr_datalogger" -#~ msgstr "" -#~ "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik " -#~ "alsjeblieft dsmr_datalogger" - -#~ msgid "" -#~ "Your current trends and statistics settings do not allow to track trends! " -#~ "You should enable it to have accurate (or any) data below." -#~ msgstr "" -#~ "Je huidige trends- en statistiekeninstellingen staan niet toe om trends " -#~ "bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder " -#~ "te zien." - -#~ msgid "" -#~ "Trends might be recalculated retroactively, depending on whether all " -#~ "historic DSMR source readings are still available." -#~ msgstr "" -#~ "Trends kunnen met terugwerkende kracht berekend worden, mits alle " -#~ "historische DSMR-uitlezingen nog beschikbaar zijn." +#~ msgstr "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" + +#~ msgid "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_datalogger" +#~ msgstr "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_datalogger" + +#~ msgid "Your current trends and statistics settings do not allow to track trends! You should enable it to have accurate (or any) data below." +#~ msgstr "Je huidige trends- en statistiekeninstellingen staan niet toe om trends bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder te zien." + +#~ msgid "Trends might be recalculated retroactively, depending on whether all historic DSMR source readings are still available." +#~ msgstr "Trends kunnen met terugwerkende kracht berekend worden, mits alle historische DSMR-uitlezingen nog beschikbaar zijn." #~ msgid "Track trends" #~ msgstr "Houd trends bij" -#~ msgid "" -#~ "Whether we should track trends by storing daily consumption summaries." -#~ msgstr "" -#~ "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." +#~ msgid "Whether we should track trends by storing daily consumption summaries." +#~ msgstr "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." #~ msgid "Trends & statistics configuration" #~ msgstr "Trends- & statistiekenconfiguratie" @@ -1251,21 +1027,14 @@ msgstr "Engels" #~ msgid "Value" #~ msgstr "Waarde" -#~ msgid "" -#~ "This page displays all settings and the status of them. You can change " -#~ "them here" -#~ msgstr "" -#~ "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je " -#~ "kunt ze hier veranderen" +#~ msgid "This page displays all settings and the status of them. You can change them here" +#~ msgstr "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je kunt ze hier veranderen" #~ msgid "BAUD rate" #~ msgstr "BAUD-waarde" -#~ msgid "" -#~ "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" -#~ msgstr "" -#~ "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 " -#~ "voor oudere versies" +#~ msgid "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" +#~ msgstr "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 voor oudere versies" #~ msgid "GRAPH_SHORT_DATETIME l, P" #~ msgstr "GRAPH_SHORT_DATETIME l G:i" @@ -1279,16 +1048,8 @@ msgstr "Engels" #~ msgid "Miscellaneous statistics" #~ msgstr "Overige statistieken" -#~ msgid "" -#~ "Tariff indicator electricity. The tariff indicator can be used to switch " -#~ "tariff dependent loads e.g boilers. This is responsibility of the P1 " -#~ "user. Note: Tariff code 1 is used for low tariff and tariff code 2 is " -#~ "used for normal tariff." -#~ msgstr "" -#~ "Tariefindicatie. Dit kan gebruikt worden om te wisselen met " -#~ "tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording " -#~ "is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " -#~ "daltarief en tariefcode 2 voor hoogtarief." +#~ msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." +#~ msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor hoogtarief." #~ msgid "Electricity 2" #~ msgstr "Elektriciteit 2" From aaf3e9ebaf0f35fcb11b926de2e8207017e8e608 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Thu, 5 May 2016 23:30:07 +0200 Subject: [PATCH 10/13] 'Slumber' consumption #115 --- docs/changelog.rst | 1 + dsmr_consumption/services.py | 24 ++++++- dsmr_consumption/tests/test_services.py | 36 +++++++++++ .../dsmr_frontend/configuration.html | 48 +++++++------- .../templates/dsmr_frontend/dashboard.html | 36 +++++------ .../templates/dsmr_frontend/export.html | 24 +++---- .../fragments/archive-xhr-statistics.html | 4 +- .../templates/dsmr_frontend/statistics.html | 18 +++--- .../templates/dsmr_frontend/status.html | 24 +++---- .../templates/dsmr_frontend/trends.html | 59 +++++++++++------- dsmr_frontend/views/trends.py | 4 ++ dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 26633 -> 27047 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 24 ++++--- 14 files changed, 195 insertions(+), 109 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index e35c431fb..362a175be 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -11,6 +11,7 @@ v1.2.0 - 2016-xx-xx - Improve data export field names (`#132 `_). - Display average temperature in archive (`#122 `_). - Pie charts on trends page overlap their canvas (`#136 `_). +- 'Slumber' consumption (`#115 `_). v1.1.2 - 2016-05-01 diff --git a/dsmr_consumption/services.py b/dsmr_consumption/services.py index 1a6e4b4b2..0bb1f27ca 100644 --- a/dsmr_consumption/services.py +++ b/dsmr_consumption/services.py @@ -3,7 +3,7 @@ import pytz from django.utils import timezone -from django.db.models import Avg, Min, Max +from django.db.models import Avg, Min, Max, Count from dsmr_consumption.models.consumption import ElectricityConsumption, GasConsumption from dsmr_consumption.models.settings import ConsumptionSettings @@ -204,3 +204,25 @@ def round_decimal(decimal_price): decimal_price = Decimal(str(decimal_price)) return decimal_price.quantize(Decimal('.01'), rounding=ROUND_UP) + + +def calculate_slumber_consumption_watt(): + """ Groups all electricity readings to find the most constant consumption. """ + most_common = ElectricityConsumption.objects.filter( + currently_delivered__gt=0 + ).values('currently_delivered').annotate( + currently_delivered_count=Count('currently_delivered') + ).order_by('-currently_delivered_count')[:5] + + if not most_common: + return + + # We calculate the average among the most common consumption read. + count = 0 + usage = 0 + + for item in most_common: + count += item['currently_delivered_count'] + usage += item['currently_delivered_count'] * item['currently_delivered'] + + return round(usage / count * 1000) diff --git a/dsmr_consumption/tests/test_services.py b/dsmr_consumption/tests/test_services.py index 91e3f4c3c..43f6b41f6 100644 --- a/dsmr_consumption/tests/test_services.py +++ b/dsmr_consumption/tests/test_services.py @@ -151,6 +151,42 @@ def test_round_decimal(self): rounded = dsmr_consumption.services.round_decimal(decimal_price=Decimal('1.555')) self.assertEqual(rounded, Decimal('1.56')) + def test_calculate_slumber_consumption_watt(self): + most_common = dsmr_consumption.services.calculate_slumber_consumption_watt() + self.assertIsNone(most_common) + + ElectricityConsumption.objects.create( + read_at=timezone.now(), + delivered_1=1, + returned_1=1, + delivered_2=2, + returned_2=2, + currently_delivered=0.25, + currently_returned=0, + ) + ElectricityConsumption.objects.create( + read_at=timezone.now() + timezone.timedelta(minutes=1), + delivered_1=1, + returned_1=1, + delivered_2=2, + returned_2=2, + currently_delivered=0.25, + currently_returned=0, + ) + ElectricityConsumption.objects.create( + read_at=timezone.now() + timezone.timedelta(minutes=2), + delivered_1=1, + returned_1=1, + delivered_2=2, + returned_2=2, + currently_delivered=1, + currently_returned=0, + ) + most_common = dsmr_consumption.services.calculate_slumber_consumption_watt() + + # Average = 250 + 250 + 1000 / 3 = 500. + self.assertEqual(most_common, 500) + class TestServicesWithoutGas(TestServices): fixtures = ['dsmr_consumption/test_dsmrreading_without_gas.json'] diff --git a/dsmr_frontend/templates/dsmr_frontend/configuration.html b/dsmr_frontend/templates/dsmr_frontend/configuration.html index a8c097603..3c4976956 100644 --- a/dsmr_frontend/templates/dsmr_frontend/configuration.html +++ b/dsmr_frontend/templates/dsmr_frontend/configuration.html @@ -54,10 +54,10 @@ {% model_meta_info datalogger_settings 'com_port' 'help_text' %} -
-
-
-
+
+
+
+
@@ -104,10 +104,10 @@ {% model_meta_info backup_settings 'latest_backup' 'help_text' %} -
-
- - + + + +
@@ -130,10 +130,10 @@ {% model_meta_info consumption_settings 'compactor_grouping_type' 'help_text' %} -
-
- - + + + +
@@ -156,10 +156,10 @@ {% model_meta_info frontend_settings 'reverse_dashboard_graphs' 'help_text' %} -
-
- - + + + +
@@ -187,10 +187,10 @@ {% model_meta_info dropbox_settings 'latest_sync' 'help_text' %} -
-
- - + + + +
@@ -218,9 +218,9 @@ {% model_meta_info weather_settings 'buienradar_station' 'help_text' %} -
-
- - + + + + {% endblock %} diff --git a/dsmr_frontend/templates/dsmr_frontend/dashboard.html b/dsmr_frontend/templates/dsmr_frontend/dashboard.html index 00f6fe8be..8264076a7 100644 --- a/dsmr_frontend/templates/dsmr_frontend/dashboard.html +++ b/dsmr_frontend/templates/dsmr_frontend/dashboard.html @@ -94,9 +94,9 @@ {{ month_statistics.total_cost|default:'-' }} - - - + + + {% endif %} @@ -147,9 +147,9 @@ {{ consumption.total_cost|default:'-' }} - - - + + + {% endif %} @@ -162,9 +162,9 @@
-
- - + + + {% endif %} @@ -177,9 +177,9 @@
-
- - + + + {% endif %} @@ -192,9 +192,9 @@
-
- - + + + {% endif %} @@ -207,9 +207,9 @@
-
- - + + + {% endif %} diff --git a/dsmr_frontend/templates/dsmr_frontend/export.html b/dsmr_frontend/templates/dsmr_frontend/export.html index 0337704b8..ba17b4540 100644 --- a/dsmr_frontend/templates/dsmr_frontend/export.html +++ b/dsmr_frontend/templates/dsmr_frontend/export.html @@ -35,9 +35,9 @@ {% blocktrans %}Summary of each hour read. Contains electricity and gas (if applicable).{% endblocktrans %} - - - + + +
@@ -50,9 +50,9 @@
-
-
- + + +
@@ -63,9 +63,9 @@
-
-
-
+ + +
@@ -82,9 +82,9 @@ {% blocktrans %}Exports the data in Comma Separated Format, which can be read by Excel.{% endblocktrans %} -
- - + + +   Download export diff --git a/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html b/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html index fc765d86b..2a62f8c10 100644 --- a/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html +++ b/dsmr_frontend/templates/dsmr_frontend/fragments/archive-xhr-statistics.html @@ -68,5 +68,5 @@ {% endfor %} {% endif %} - - + + diff --git a/dsmr_frontend/templates/dsmr_frontend/statistics.html b/dsmr_frontend/templates/dsmr_frontend/statistics.html index 3ed67e656..a65283497 100644 --- a/dsmr_frontend/templates/dsmr_frontend/statistics.html +++ b/dsmr_frontend/templates/dsmr_frontend/statistics.html @@ -47,9 +47,9 @@ {% endif %} - - - + + +
@@ -115,9 +115,9 @@ {% blocktrans %}Tracking meter statistics is disabled. Enable this feature in the datalogger settings to view statistics.{% endblocktrans %}
{% endif %} - - - + + + {% endif %} @@ -154,9 +154,9 @@ {% endif %} - - - + + + diff --git a/dsmr_frontend/templates/dsmr_frontend/status.html b/dsmr_frontend/templates/dsmr_frontend/status.html index b2d610a12..763a9a32c 100644 --- a/dsmr_frontend/templates/dsmr_frontend/status.html +++ b/dsmr_frontend/templates/dsmr_frontend/status.html @@ -32,9 +32,9 @@ {% trans 'View all releases' %} - - - + + +
@@ -65,9 +65,9 @@ {{ total_reading_count|intcomma }} -
- - + + +
@@ -126,9 +126,9 @@ {% endif %} -
- - + + +
@@ -157,9 +157,9 @@ -
- - + + + diff --git a/dsmr_frontend/templates/dsmr_frontend/trends.html b/dsmr_frontend/templates/dsmr_frontend/trends.html index a1b23a37b..dfd302853 100644 --- a/dsmr_frontend/templates/dsmr_frontend/trends.html +++ b/dsmr_frontend/templates/dsmr_frontend/trends.html @@ -29,10 +29,10 @@
-
- - - + + + + {% endif %} {% if capabilities.electricity_returned %} @@ -44,10 +44,10 @@
-
- - - + + + + {% endif %} {% if capabilities.gas %} @@ -59,10 +59,10 @@
-
- - - + + + + {% endif %} {% if capabilities.electricity %} @@ -75,10 +75,10 @@
-
- - - + + + +
@@ -88,13 +88,30 @@
-
-
-
-
+ + + + + {% endif %} + + {% if slumber_consumption_watt %} +
+
+
+
+ {% blocktrans %}Most common electricity consumption{% endblocktrans %} +
+
+   {{ slumber_consumption_watt }}   {% trans "Watt" %} +   + {% blocktrans %}Average calculated among the top five most common electricity consumption read. This might also be the (minimum) constant electricity consumption in your home.{% endblocktrans %} +
+
+
+
{% endif %} - + {% endblock %} diff --git a/dsmr_frontend/views/trends.py b/dsmr_frontend/views/trends.py index 12e92328d..3e4cb6dc3 100644 --- a/dsmr_frontend/views/trends.py +++ b/dsmr_frontend/views/trends.py @@ -29,6 +29,10 @@ def get_context_data(self, **kwargs): # Average of real consumption/return per hour. average_consumption_by_hour = dsmr_stats.services.average_consumption_by_hour() + # The most constant usage. + context_data['slumber_consumption_watt'] = dsmr_consumption.services.\ + calculate_slumber_consumption_watt() + context_data['avg_consumption_x'] = json.dumps( ['{}:00'.format(int(x['hour_start'])) for x in average_consumption_by_hour] ) diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index c7da06447..10a3a6f53 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 7) +VERSION = (1, 2, 0, 'beta', 8) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index d7c14b2896742c76b879f50aab103ea4769e09ab..c975710958cc655596fcd301c9e75fcff48d90eb 100644 GIT binary patch delta 6299 zcmZ|Td3=<`9mnwrAqNlwK@x}%cnETYBS^S~ltUB(iD0-aM`0nGWOM9lvPnd-D~bZG zpb(%aBB&@;DyRYLf#nbsL=go!ErOtJ5u}QW2x>pyeI}Ov(dWf)-!t<(&pb1~nP)dT ze_zDf{Sl$#P3kT+9E~H4X^D@=8WT`CL9NCdPBMlja|D~dAWY~~1t2a54LKb&{Xuo3wmk4>$`=%c!Xz55!&#`ce-g=# z*=a94iCUUVsOwrd#*D;4sLl2e>cOk918&6j_z7x)k=(2aB%(5yjLKMAn~*!w-ZW?p zvr%h0!(LE~8u^_#4CkQM_C4&4N3ka+q`GT=Gpe6as0ZewGFXI~aR8OExz6Ry`;MmD)7aKn9>PFc?SRd|N+Y>n+K5YDDF{dUw$kD_+_m$p5ki<|Of z)TZo%4rU|!*OVfcngtlc^UZ4%G~;bpAKyWx>?0hDM^KwBy{nr#FAk@^0ng$O*Z@CI zcOUpQW>Jss#`y^L7d}Hhv%5RsQ|PDuEr#^K85zdhihdl1TTwT}_HZ}ldQ6~x88y&` zYaQGM~FW7p$KJHq!MRhzB)$vs1%{4Po{XK5azlurJ_oD`Q2Ag4IU-!NiAqwiKmvuBY zr(TTOgmY~Blc)!6w(SQ|Gq_;e6Z*NEw=?R2qp&&Vqxuio`eXKdjWzTx1&#cqy`b(5 zHf5-e`l4nu3X`!I)$s$U0X|{Rzk%A_hpZQo?P8ks=X)MU;+^;~uEbd0(W83*pQWHp zH9OPY9CI;}`eM{xScdvyS%WLt%^Oj#W9~qAb4|jVsQd9|+=%=$m-%q8{~$M0lW{He zyHI;Ab+GnSi0^L-dXER-GR#5tqdAQv#Uu~m7YoOrGBOLbDXUStc{%F!dm6RNH=uU? zE2szUMs2!ds0p3Nm+&V{;`wF+`B6u2V+wwV_3%9M>Y7U!iD^UK*QP6KfJ0E5whHyY zWvKg}Lv6Ae)WG&&93HagPopyU6^69CFH(rdhU8JUM9ri#mSP45a5dhIjmfhf@DS?y zHOP0AsX@*71nR-xSbs(>VST<_l!0qe=Q|D~|LZCAq(LJ;h1y)_P#s6}HK)uZqEhc* z6!t-7B-5TBY}>OjmiAoKj3=S)D@1+agi!r0K@DWpaPr@R!V5HLckjkFcnUjVR2FH+ z>ruOXBI>#-OvOd0>o($e{1nw+?-8!K$c8t5P2RUm?qG8jp3Ih-zPB>u*~dk8{6I zCSpU*FTwEd|5Ft7fag&i*I*|+jLJkLJ4@~DQ3D-`>fl+_9@&U`;66;kZ}1wdH^I$p z3Odv?PbepP>Bjph^uT9OYkCB=J5Qrhcm}lzFJcA$jJ+{<8ygDOALiKmRoVWw1?Ugp}*TR zy^y!eG-3vN_2v@Wh;~E;QG4))hW}dXQrmzeB76+xbBQf`tP%9b>u!D_!fz6OMChyi zMa};y3eOOHjfanod@8+J#J5B=p<}m;sliA(9boH1Up`kKX;ie{zNP$-XOLUI@S?AiSa}gF@d;3Tqbnr zEzr@1cr{$&7g3v_KhckvO?*yFBXoRBbRhZ?UP8w`#LL8Ah#0c)Jx(Pu2pzoM;UBFZ z!Zm&)a4B(t*h=gt_(}=?MCe<;*4F5eS?;`#| z93={fWJ3Sn_z2b>arV9(8tPNN58okD>;=V`OZ;4ggS$GG`ux7qiqbUh@RtWY{-Ew@=<_=>0~KXXVW8BTUgK|`AKxJ7f4Xg6v%mf5 zq?le#MvogZ`c-$zY~z-@Utg1(=|qMcZ;7`!SmvAI3wnLQ@=9;n^s)+HF^?_t7JL19 zPJkvS&+AnBit?ROua_}b1_EWpJkU>bmB&+-=PgfnhWdgIBd_#$ik(29*eUb|?Vvp+ z-n9SsnD|PM-zlP-fZyjYNUvTwD7j|#pym;grQTrms=Z^uKsa&|L|w` xnu4rpk+kp1{v|@(@@+)p@m_Dqe@EqbtNmF?HJe9QL~~2VgsEJ%ctTa<{{Znu4_N>J delta 5995 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 IKcn&g0S&054*&oF diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.po b/dsmrreader/locales/nl/LC_MESSAGES/django.po index 2ba4e9251..bb1772b8d 100644 --- a/dsmrreader/locales/nl/LC_MESSAGES/django.po +++ b/dsmrreader/locales/nl/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-05-04 23:48+0200\n" -"PO-Revision-Date: 2016-05-04 23:41+0100\n" +"POT-Creation-Date: 2016-05-05 23:29+0200\n" +"PO-Revision-Date: 2016-05-05 23:10+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -442,13 +442,13 @@ msgid "Day totals" msgstr "Dagtotalen" msgid "Summary of each day. Contains electricity, gas and costs (if applicable)." -msgstr "Samenvatting van elke dag. Bevat electriciteit, gas en gemaakte kosten (wanneer van toepassing)." +msgstr "Samenvatting van elke dag. Bevat elektriciteit, gas en gemaakte kosten (wanneer van toepassing)." msgid "Hour totals" msgstr "Uurtotalen" msgid "Summary of each hour read. Contains electricity and gas (if applicable)." -msgstr "Samenvatting van elk uur. Bevat electriciteit en gas (wanneer van toepassing)." +msgstr "Samenvatting van elk uur. Bevat elektriciteit en gas (wanneer van toepassing)." msgid "Select date range start" msgstr "Selecteer startdatum" @@ -568,10 +568,10 @@ msgid "There are too many unprocessed readings. Your backend processachtergrondproces of is deze gecrashed." msgid "Latest electricity consumption tracked" -msgstr "Meest recente electriciteitsverbruik verwerkt" +msgstr "Meest recente elektriciteitsverbruik verwerkt" msgid "It has been a while since electricity consumption was tracked. Your backend process might hang or has been crashed." -msgstr "Het meest recente electriciteitsverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgstr "Het meest recente elektriciteitsverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest gas consumption tracked" msgstr "Meest recente gasverbruik verwerkt" @@ -583,7 +583,7 @@ msgid "Data availability" msgstr "Beschikbaarheid gegevens" msgid "Based on readings until this moment. Electricity usage should be always available. Gas usage and electricity return depend on your home situation." -msgstr "Gebaseerd op verwerkte uitlezingen tot nu toe. Electriciteitsverbruik zou altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering hangen af van je thuissituatie." +msgstr "Gebaseerd op verwerkte metingen tot nu toe. Elektriciteitsverbruik zou altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering hangen af van je thuissituatie." msgid "Data type" msgstr "Soort gegevens" @@ -614,10 +614,16 @@ msgid "Average hourly gas consumed (in %%)" msgstr "Gemiddeld gasverbruik per daguur (in %%)" msgid "Electricity tariff ratio (passed week)" -msgstr "Electriciteitsverbruik piek- en daltarief (afgelopen week)" +msgstr "Elektriciteitsverbruik piek- en daltarief (afgelopen week)" msgid "Electricity tariff ratio (passed month)" -msgstr "Electriciteitsverbruik piek- en daltarief (afgelopen maand)" +msgstr "Elektriciteitsverbruik piek- en daltarief (afgelopen maand)" + +msgid "Most common electricity consumption" +msgstr "Veelvoorkomend elektriciteitsverbruik" + +msgid "Average calculated among the top five most common electricity consumption read. This might also be the (minimum) constant electricity consumption in your home." +msgstr "Gemiddeld elektriciteitsverbruik berekend over de vijf meest voorkomende waardes. Dit is vaak ook het (minimale) elektriciteitsverbruik van je woning." msgid "Trend & statistics" msgstr "Trends & statistieken" From 21bc7d65cd136da03e84f1ffdd485005294405ce Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Thu, 12 May 2016 21:07:57 +0200 Subject: [PATCH 11/13] Show lowest & highest Watt peaks #138 --- docs/_static/screenshots/statistics.png | Bin 124546 -> 158715 bytes docs/changelog.rst | 1 + dsmr_consumption/services.py | 17 + dsmr_consumption/tests/test_services.py | 37 ++ .../dsmr_frontend/configuration.html | 2 +- .../templates/dsmr_frontend/dashboard.html | 2 +- .../templates/dsmr_frontend/export.html | 2 +- .../templates/dsmr_frontend/statistics.html | 39 +- .../templates/dsmr_frontend/status.html | 2 +- .../templates/dsmr_frontend/trends.html | 18 - dsmr_frontend/views/statistics.py | 8 + dsmr_frontend/views/trends.py | 4 - dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 27047 -> 27283 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 510 +++++++++++++----- 15 files changed, 486 insertions(+), 158 deletions(-) diff --git a/docs/_static/screenshots/statistics.png b/docs/_static/screenshots/statistics.png index be9b3883c62b621bcc1c7de03141403154e4a181..2fbf35ee7667b424f5ca709a7cdfced3bdf9a692 100644 GIT binary patch literal 158715 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

4`s&V| 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 WWetPh8?`{f&n**6W5PA(=>G@bN-C-V literal 124546 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. - Pie charts on trends page overlap their canvas (`#136 `_). - 'Slumber' consumption (`#115 `_). +- Show lowest & highest Watt peaks (`#138 `_). v1.1.2 - 2016-05-01 diff --git a/dsmr_consumption/services.py b/dsmr_consumption/services.py index 0bb1f27ca..50c3eeac0 100644 --- a/dsmr_consumption/services.py +++ b/dsmr_consumption/services.py @@ -226,3 +226,20 @@ def calculate_slumber_consumption_watt(): usage += item['currently_delivered_count'] * item['currently_delivered'] return round(usage / count * 1000) + + +def calculate_min_max_consumption_watt(): + """ Returns the lowest and highest Wattage consumed. """ + min_max = ElectricityConsumption.objects.filter( + currently_delivered__gt=0 + ).aggregate( + min_watt=Min('currently_delivered'), + max_watt=Max('currently_delivered') + ) + + for x in min_max.keys(): + if min_max[x]: + min_max[x] = int(min_max[x] * 1000) + + print(min_max) + return min_max diff --git a/dsmr_consumption/tests/test_services.py b/dsmr_consumption/tests/test_services.py index 43f6b41f6..f3b0e2acd 100644 --- a/dsmr_consumption/tests/test_services.py +++ b/dsmr_consumption/tests/test_services.py @@ -187,6 +187,43 @@ def test_calculate_slumber_consumption_watt(self): # Average = 250 + 250 + 1000 / 3 = 500. self.assertEqual(most_common, 500) + def test_calculate_min_max_consumption_watt(self): + min_max = dsmr_consumption.services.calculate_min_max_consumption_watt() + self.assertIsNone(min_max['min_watt']) + self.assertIsNone(min_max['max_watt']) + + ElectricityConsumption.objects.create( + read_at=timezone.now(), + delivered_1=1, + returned_1=1, + delivered_2=2, + returned_2=2, + currently_delivered=0.25, + currently_returned=0, + ) + ElectricityConsumption.objects.create( + read_at=timezone.now() + timezone.timedelta(minutes=1), + delivered_1=1, + returned_1=1, + delivered_2=2, + returned_2=2, + currently_delivered=0.25, + currently_returned=0, + ) + ElectricityConsumption.objects.create( + read_at=timezone.now() + timezone.timedelta(minutes=2), + delivered_1=1, + returned_1=1, + delivered_2=2, + returned_2=2, + currently_delivered=6.123, + currently_returned=0, + ) + min_max = dsmr_consumption.services.calculate_min_max_consumption_watt() + + self.assertEqual(min_max['min_watt'], 250) + self.assertEqual(min_max['max_watt'], 6123) + class TestServicesWithoutGas(TestServices): fixtures = ['dsmr_consumption/test_dsmrreading_without_gas.json'] diff --git a/dsmr_frontend/templates/dsmr_frontend/configuration.html b/dsmr_frontend/templates/dsmr_frontend/configuration.html index 3c4976956..46d0420a8 100644 --- a/dsmr_frontend/templates/dsmr_frontend/configuration.html +++ b/dsmr_frontend/templates/dsmr_frontend/configuration.html @@ -222,5 +222,5 @@ - + {% endblock %} diff --git a/dsmr_frontend/templates/dsmr_frontend/dashboard.html b/dsmr_frontend/templates/dsmr_frontend/dashboard.html index 8264076a7..11fd9ae66 100644 --- a/dsmr_frontend/templates/dsmr_frontend/dashboard.html +++ b/dsmr_frontend/templates/dsmr_frontend/dashboard.html @@ -212,7 +212,7 @@ {% endif %} - + {% endblock %} diff --git a/dsmr_frontend/templates/dsmr_frontend/export.html b/dsmr_frontend/templates/dsmr_frontend/export.html index ba17b4540..c84139349 100644 --- a/dsmr_frontend/templates/dsmr_frontend/export.html +++ b/dsmr_frontend/templates/dsmr_frontend/export.html @@ -90,7 +90,7 @@   Download export - + {% endblock %} {% block stylesheets %} diff --git a/dsmr_frontend/templates/dsmr_frontend/statistics.html b/dsmr_frontend/templates/dsmr_frontend/statistics.html index a65283497..7f7ff1f9f 100644 --- a/dsmr_frontend/templates/dsmr_frontend/statistics.html +++ b/dsmr_frontend/templates/dsmr_frontend/statistics.html @@ -50,7 +50,7 @@ - +

@@ -118,7 +118,38 @@
- + + +
+
+
+
+ {% trans "Usage statistics" %} +
+
+ + + + + + + + + + + + + +
+ {% trans "Most common electricity consumption" %} +
+ {% blocktrans %}Average calculated among the top five most common electricity consumption read. This might also be the (minimum) constant electricity consumption in your home.{% endblocktrans %}
+
  {{ slumber_consumption_watt|intcomma|default:'-' }}   {% trans "Watt" %}
{% trans "Lowest electricity consumption read" %}   {{ min_max_consumption_watt.min_watt|intcomma|default:'-' }}   {% trans "Watt" %}
{% trans "Highest electricity consumption read" %}   {{ min_max_consumption_watt.max_watt|intcomma|default:'-' }}   {% trans "Watt" %}
+
+
+
+
+ {% endif %}
@@ -157,7 +188,7 @@
- + - + {% endblock %} diff --git a/dsmr_frontend/templates/dsmr_frontend/status.html b/dsmr_frontend/templates/dsmr_frontend/status.html index 763a9a32c..40f416455 100644 --- a/dsmr_frontend/templates/dsmr_frontend/status.html +++ b/dsmr_frontend/templates/dsmr_frontend/status.html @@ -162,5 +162,5 @@ - + {% endblock %} diff --git a/dsmr_frontend/templates/dsmr_frontend/trends.html b/dsmr_frontend/templates/dsmr_frontend/trends.html index dfd302853..0dde31e0e 100644 --- a/dsmr_frontend/templates/dsmr_frontend/trends.html +++ b/dsmr_frontend/templates/dsmr_frontend/trends.html @@ -93,24 +93,6 @@ {% endif %} - - {% if slumber_consumption_watt %} -
-
-
-
- {% blocktrans %}Most common electricity consumption{% endblocktrans %} -
-
-   {{ slumber_consumption_watt }}   {% trans "Watt" %} -   - {% blocktrans %}Average calculated among the top five most common electricity consumption read. This might also be the (minimum) constant electricity consumption in your home.{% endblocktrans %} -
-
-
-
- {% endif %} - {% endblock %} diff --git a/dsmr_frontend/views/statistics.py b/dsmr_frontend/views/statistics.py index 89203fd3c..dd1630105 100644 --- a/dsmr_frontend/views/statistics.py +++ b/dsmr_frontend/views/statistics.py @@ -5,6 +5,7 @@ from dsmr_consumption.models.energysupplier import EnergySupplierPrice from dsmr_datalogger.models.settings import DataloggerSettings import dsmr_backend.services +import dsmr_consumption.services class Statistics(TemplateView): @@ -28,4 +29,11 @@ def get_context_data(self, **kwargs): except EnergySupplierPrice.DoesNotExist: pass + # Use stats + context_data['slumber_consumption_watt'] = dsmr_consumption.services.\ + calculate_slumber_consumption_watt() + + context_data['min_max_consumption_watt'] = dsmr_consumption.services.\ + calculate_min_max_consumption_watt() + return context_data diff --git a/dsmr_frontend/views/trends.py b/dsmr_frontend/views/trends.py index 3e4cb6dc3..12e92328d 100644 --- a/dsmr_frontend/views/trends.py +++ b/dsmr_frontend/views/trends.py @@ -29,10 +29,6 @@ def get_context_data(self, **kwargs): # Average of real consumption/return per hour. average_consumption_by_hour = dsmr_stats.services.average_consumption_by_hour() - # The most constant usage. - context_data['slumber_consumption_watt'] = dsmr_consumption.services.\ - calculate_slumber_consumption_watt() - context_data['avg_consumption_x'] = json.dumps( ['{}:00'.format(int(x['hour_start'])) for x in average_consumption_by_hour] ) diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 10a3a6f53..7deb7236f 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 8) +VERSION = (1, 2, 0, 'beta', 9) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index c975710958cc655596fcd301c9e75fcff48d90eb..e070e6ed3493846920407d0d18c7e11462cb272f 100644 GIT binary patch delta 5921 zcmZA53w+Pz0>|-Z_p2?Njal+{w+WjuAYU8P##!ct;U2mBp88l7>CzmE9`-{V;6i56LBA^-;e0W%NUJI z8W|IY6-bk*#0q0PvxP!C8pbDC7h((Q8!;Zg!eIObb%Jvki5D>x!x|gY0Ao-WYJpc_ z8pdEYF2SM5f95+rBJeUc;rb>#+0L*vHsgzq7=*)69Y!=fMckV&0z){o+oJI}cPh5sk*Vu`zMo+i7$~A08E$s)WneIgm>=bH6es$lUckQOB zJy8hi0Cw! zrC);Dq;H@Pw_{VTZ)z!UP7~VRZoWKoE&(}>4*GNu@(p)Pm`hv5&HgWWRh59Z=P>TTHadaTM( z1D%ih-6GVceH!%?yo&X38y4bjjKl8S2Tf>D7uH`t%%ho}RjvCmzs0-~wov0S| z3O$F~8!;?H7{+4)COgwHk$Mj5MK%s~i)J_%qh3UnnXJD~xQzyl{1ED1okqQYV!GO= zA{Esy*Etb&!FyfZk3Qb`#*8&j`D_1lJ8p#zwN=TRq)?O_Mf7WI8!Y>N5LxyUv$tMEoW|NAM-q#=oibtNvr zgP7LSZmy^-ySeIP5bal^_JR*%u>-DTS7)If%R@KVO?C|XQon%xFsqk+PdtP^>f5pI z?|&_YN*aQ*?PjY&ZK};TOmTHpRVpBJc%li-%Dw63TS6DVv}+b#v5X*dDdp zyP=cCJCqWIay9x3L6MS>M^X9Cd-j z9Q(Tt$h*z-M9sJeb>TVAM{>CTx`$8EpcQ!0eeo8qrM?+8@@c%@w7F)W2J{4Ki7QYm z^$LdIR@92T@4nyZ+CRr|+7F>7d<^xwGdHpRTDpi_d%|l_14+ST?26jm!?77o!&F?1 zDYyys*nN-c7tr56HOZ)cSvV34QRl019zyoLx!_UY$uXS=*b$YWW-=dj?-rp(T!Fek z73xGgP`Bb+_x%Y}|KIRtj2LJqG8UPvDMGDaHEJbxp(gI_r=TS}>HHaW56_@FMh>#~ zEFQ;DZ;C}Y8(U#5>dhI=dt2x6VLfb#k=P0Ky!S+1a5@gh`S_Hc|AQ1BrJ-bq{g=z{ zs2ScjlxG{4qki}yw#Or=7gO{wyB9j5Zb24mKx0q?nv21>6tyDDoj)O$G`(mX%=OJ; z3ehwi!TR_k>W7yw3%DaV=^^4!HJ6jIq)8bBs8cryTV0{O=#?x%k8HoLoPSoi7F_o7y&?|AzH z8jhW*zl+b~1>_p$nF;of)>+iRV)E_p5>OLsk?+|K-DyamVFb>?sjhwu^}|0bzdL`(h#LkH#w032R)3FENh# zFQ@?q7T5tcL|v#I>O|SjTT%T=P&1w9+E=3buXF7mArtV-ckYWz*pv?OlkEjFP$%k# zy1*D$FLmEP>|Bl-_-pR_U8w%wxbH8ZCKNTr4xk0Vs+aRzq&3x9C13IhXJ%0l}Tj4rbGcmf9T{WR1josPPt9@4#TV}dzHLOfbNP>o|1 z38^dD4?QAlTwNo+-<9>m{LPiWM-Bcl^1f?hTy=k*Reja91>;Yy{5t+jek3E*_At@X ze?^`o)#SgAOu?g|sDl>Q<9> z#J z(v3Vwj*|&Q$CsoHxsI^y>yG>QTu0WDNS5e#98WqC9TQ0y`9l?sm&w!QH|^nV6h0@s zR_gw`Y9B8mOURX@%oVyiZ^AdoMOPOmT=@~qB)v#6=|G+*;p8a!2U$SIlC507?nveH z2l4L{_8xz2y%0ap%ieRjM0KP7D$;IC=Wa#Rh4 z7}u$svW}~$>n(kr>+2!OXN)wND@c|iSYMKNY33zNkT{Ju+^zUd)0`t{3!*#vhw`$!m{$hiDlKfUET=~Pw(XG zl-@lp(;t)NyHe>|otbrQY`AYq!L)+%f@1&A*$u153>q2qzb&r}O{||VvY_<#(z^<$ SmR&h-!PJ7{>Mi-l!~O%H8oKiU delta 5778 zcmYk=33yId0><%^RS+VPMMQ`YTdX1WU5g-=*xH1#?<8I9biS%6W-R5Cj25-mps4x6 zScfQTtJ>F&rD$iYMOBTZ{lDKmo@egk&F`FZ?>+b2bI-lW!+q9g&1oOkl`#Jt!&c14 zm{Pbn$e1jZL)B``g-By)G8Zunf56801RG&elrhPei8Ps2sN;5`8;@f!_Ag;f0n9?0 z%s5YmA=c4-AfJJbt zt?$Re)W1c>W-g+4pjedad*@wu7{dJbz;Npb97cT~Mqt%gj=`2#71L1dE>wp())lB3 z*o2yay{G|vhq-teH3RRJ=3G7I$rRKu2Q{?|QFpo$HLzW%8OgW%57_n-sPoREE^rm~ zDDI#JX37{70FkKurI5)rl~6O-stofVMr?-k6BPP#xxA3U0t`e2SBCGSeiVA&=XPO)!RkW&uBR13OSNpMjf~AKKn-{sj@0|_TZw6+ zAq#cFISjzdSOu>m*D%4Aoo8Dcn^DiOE<$e7T*k(zlVlT2#)+tB{S~VJ-57-XFkbKf zQE$PR`=}9yGQXuT8B;M0b;2^#Td@{3_4`nFdI`1K@7Q*qs?L;0qZVa7jKdDd`Zc4F zL(Oa~!1c{`3cBNbEQH^nrtB1U!;7fJR=t`tb%U@i^-Xvef5XCftGaW+hnPY=um<~m zSYNoBdXrktfNx+X^cYEGkLC>O(cH5JFm3wa#G?AEj~Z|q>a7@Dm-*L+CYuJm1|!Is707<+n1v* zw9B@iL*2n++aB7$S-gp;3wFX1I2hHx%ho@$`#o0I5egdlb$ft+Lpx=tj_RZCs1rux z2vo<@Py_tj?%#=8-RG@Ok>z5d8u6XS_BbBr;t~wv9lfOY{|gFQR8yKbi(@+aQJ;@m z3%RHd%PL&LYR*Hwj%m%D#g&0?QqRQJn1}o`&-oFDjhZ_%)eF~9pNLv(@h!BbTztPN z=sj+XxtNNqM{^UI6cgQ&-&oicH6xQzi_(o+%?nYl-%8Xf--KHATTvG}j9PS;Q8)Ae zH{(l;^b;lW~^M;~6I4)Fw3s3`D+Lrl`p|F7lt?t8E7H?n`3`k+xu_kJ@r=yM=hw(TM zbzC0yz^kbK>b7%CLl(TrL|zE94mF@#s2h3VqM&Ez+uj**1nL6usE!(AAiiby_dy*$ z64TIyx|37Ln9ViR3|8*o%tTAnowrBLSYPWv)FX5ar4U5nLoAFlF#~gOI6g$J-d?Fr z2k)RRI2sG#N2vFFHtIt8*cH#=0<6-JK5-9bV@fCI#*Slku5WHr(23Ff8B`6cqo%eO zY7MwhQ$GhakoD+~dr&j5-x}4$cz>4+w{FK^_6Kp07G(tLyoy)=t73xp{il#lLpuHm zx8VC2&TZ(x8K@ch1Z&`@SRN0f*2;b4v72Ju9Me(lt8D$CwODuOdyx}AWkaYrTfU{8pTjipl3+%vXJc3bp6LkkKPzOd0aIA*9P%B&S zj(R&rpgNvm+m~W#>RV9#ow57xq6X+U&>5gBl7dE%m z^dRF%Px691Cv46)Nu{!6n+j~%q!DRArjT2tFVS|ER3!DuAfoL9@(=PQDZo_yihW2D z(Z-AD{q^#jx5n2TbI4;YjJ*_26W)IBZ&NMgzmQMJ>+L;TsAp}98_6?U7eCta$5@v% zCz+%=`J4oi@5w*O4AP72;riaK3O{d>56O8lfm|jvh&FwnCXqjr@uVGzBSGA)wk;0k znDr^1v*lOTZ>`($C8NGQi3cdGf8>Uf?Opx$luB9?YIhb-0gJ(?jq~RK+>AbBie>L zm?M~L%K@Bwg>p+W)p&fPvVuLibGP;yIJND=4UDa$HjFhDi\n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -21,11 +21,18 @@ msgstr "" msgid "Backend" msgstr "Achterkant" -msgid "Unsupported database engine \"{}\" active, some features might not work properly" -msgstr "De database engine \"{}\" wordt niet actief ondersteund, sommige functies werken hierdoor mogelijk minder goed" +msgid "" +"Unsupported database engine \"{}\" active, some features might not work " +"properly" +msgstr "" +"De database engine \"{}\" wordt niet actief ondersteund, sommige functies " +"werken hierdoor mogelijk minder goed" -msgid "Generates a generic event triggering apps for backend operations, cron-like." -msgstr "Genereert een generiek signaal dat gebruikt kan worden door plugins voor achtergrondoperaties, zoals cron." +msgid "" +"Generates a generic event triggering apps for backend operations, cron-like." +msgstr "" +"Genereert een generiek signaal dat gebruikt kan worden door plugins voor " +"achtergrondoperaties, zoals cron." msgid "Forces single run, overriding Infinite Command mixin" msgstr "Forceert enkele uitvoer." @@ -36,26 +43,45 @@ msgstr "Backup" msgid "Backup daily" msgstr "Dagelijkse backup" -msgid "Create a backup of your data daily. Stored locally, but can be exported using Dropbox." -msgstr "Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan geexporteerd worden via Dropbox." +msgid "" +"Create a backup of your data daily. Stored locally, but can be exported " +"using Dropbox." +msgstr "" +"Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan " +"geexporteerd worden via Dropbox." msgid "Compress" msgstr "Comprimeren" -msgid "Create backups in compressed (gzip) format, saving a significant amount of disk space." -msgstr "Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke hoeveelheid schijfruimte bespaard wordt." +msgid "" +"Create backups in compressed (gzip) format, saving a significant amount of " +"disk space." +msgstr "" +"Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke " +"hoeveelheid schijfruimte bespaard wordt." msgid "Backup timestamp" msgstr "Tijdstip van backup" -msgid "Daily moment of creating the backup. You should prefer a nightly timestamp, as it might freeze or lock the application shortly during backup creation." -msgstr "Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de nacht te pakken, gezien het maken van een backup de werking van de applicatie kort kan onderbreken." +msgid "" +"Daily moment of creating the backup. You should prefer a nightly timestamp, " +"as it might freeze or lock the application shortly during backup creation." +msgstr "" +"Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de " +"nacht te pakken, gezien het maken van een backup de werking van de " +"applicatie kort kan onderbreken." msgid "Latest backup" msgstr "Meest recente backup" -msgid "Timestamp of latest backup created. Automatically updated by application. Please note that the application will ignore the \"backup_time\" setting the first time used." -msgstr "Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer genegeerd!" +msgid "" +"Timestamp of latest backup created. Automatically updated by application. " +"Please note that the application will ignore the \"backup_time\" setting the " +"first time used." +msgstr "" +"Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. " +"N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer " +"genegeerd!" msgid "Backup configuration" msgstr "Backupconfiguratie" @@ -63,14 +89,32 @@ msgstr "Backupconfiguratie" msgid "Dropbox access token" msgstr "Dropbox 'access token'" -msgid "The access token for your Dropbox account. You should register an App for your own Dropbox account (https://www.dropbox.com/developers/apps). Please select \"Permission type\" named \"App folder\" to restrict unneeded access. Backups will be synced to a dedicated folder in your account. After creating your App you should be able to generate an \"Access token\" and enter it here. For more information, see https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" -msgstr "Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen account een applicatie registeren (https://www.dropbox.com/developers/apps). Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder\" om de gedeelde toegang tot je account te beperken. Backups worden hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" +msgid "" +"The access token for your Dropbox account. You should register an App for " +"your own Dropbox account (https://www.dropbox.com/developers/apps). Please " +"select \"Permission type\" named \"App folder\" to restrict unneeded access. " +"Backups will be synced to a dedicated folder in your account. After creating " +"your App you should be able to generate an \"Access token\" and enter it " +"here. For more information, see https://blogs.dropbox.com/developers/2014/05/" +"generate-an-access-token-for-your-own-account" +msgstr "" +"Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen " +"account een applicatie registeren (https://www.dropbox.com/developers/apps). " +"Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder" +"\" om de gedeelde toegang tot je account te beperken. Backups worden " +"hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox " +"een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" " +"genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox." +"com/developers/2014/05/generate-an-access-token-for-your-own-account" msgid "Latest sync" msgstr "Meest recente synchronisatie" -msgid "Timestamp of latest sync with Dropbox. Automatically updated by application." -msgstr "Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit automatisch bij." +msgid "" +"Timestamp of latest sync with Dropbox. Automatically updated by application." +msgstr "" +"Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit " +"automatisch bij." msgid "Dropbox configuration" msgstr "Dropbox-configuratie" @@ -79,16 +123,26 @@ msgid "Consumption" msgstr "Verbruik" msgid "Meter Reading electricity delivered to client (low tariff) in 0,001 kWh" -msgstr "Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt uur" +msgstr "" +"Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt " +"uur" msgid "Meter Reading electricity delivered by client (low tariff) in 0,001 kWh" -msgstr "Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 Watt uur" +msgstr "" +"Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 " +"Watt uur" -msgid "Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" -msgstr "Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt uur" +msgid "" +"Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" +msgstr "" +"Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt " +"uur" -msgid "Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" -msgstr "Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 Watt uur" +msgid "" +"Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" +msgstr "" +"Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 " +"Watt uur" msgid "Actual electricity power delivered (+P) in 1 Watt resolution" msgstr "Daadwerkelijk geleverde elektriciteit geleverd (-P) in 1 Watt stappen" @@ -118,7 +172,8 @@ msgid "Description" msgstr "Omschrijving" msgid "For your own reference, i.e. the name of your supplier" -msgstr "Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" +msgstr "" +"Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" msgid "Electricity 1 price (low tariff)" msgstr "Prijs elektriciteit 1 (daltarief)" @@ -147,8 +202,11 @@ msgstr "Per minuut" msgid "Compactor grouping type" msgstr "Metingen groeperen" -msgid "Electricity readings are read every 10 seconds. We can group those for you." -msgstr "Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je groeperen." +msgid "" +"Electricity readings are read every 10 seconds. We can group those for you." +msgstr "" +"Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je " +"groeperen." msgid "Consumption configuration" msgstr "Verbruiksconfiguratie" @@ -159,11 +217,18 @@ msgstr "Datalogger" msgid "Performs an DSMR P1 telegram reading on the COM port." msgstr "Leest een DSMR P1 telegram uit van de COM-poort (meting)." -msgid "Generates a FAKE reading. DO NOT USE in production! Used for integration checks." -msgstr "Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor integratietests." +msgid "" +"Generates a FAKE reading. DO NOT USE in production! Used for integration " +"checks." +msgstr "" +"Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor " +"integratietests." -msgid "Required option to acknowledge you that you WILL mess up your data with this." -msgstr "Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data kan verprutsen." +msgid "" +"Required option to acknowledge you that you WILL mess up your data with this." +msgstr "" +"Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data " +"kan verprutsen." msgid "Include gas consumption" msgstr "Neem gasverbruik mee" @@ -171,8 +236,11 @@ msgstr "Neem gasverbruik mee" msgid "Include electricity returned (solar panels)" msgstr "neem teruglevering elektriciteit mee (zonnepanelen)" -msgid "Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" -msgstr "Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-my-data" +msgid "" +"Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" +msgstr "" +"Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-" +"my-data" msgid "Timestamp indicating when the reading was taken, according to the meter" msgstr "Moment waarop de meting is gedaan, volgens de meter." @@ -181,13 +249,22 @@ msgid "Last hourly reading timestamp" msgstr "Tijdstip van laatste meting" msgid "Whether this reading has been processed for merging into statistics" -msgstr "Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" +msgstr "" +"Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" msgid "DSMR reading" msgstr "DSMR-meting" -msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." -msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor piektarief." +msgid "" +"Tariff indicator electricity. The tariff indicator can be used to switch " +"tariff dependent loads e.g boilers. This is responsibility of the P1 user. " +"Note: Tariff code 1 is used for low tariff and tariff code 2 is used for " +"normal tariff." +msgstr "" +"Tariefindicatie. Dit kan gebruikt worden om te wisselen met " +"tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is " +"voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " +"daltarief en tariefcode 2 voor piektarief." msgid "Number of power failures in any phases" msgstr "Aantal stroomstoringen in alle fases" @@ -199,19 +276,23 @@ msgid "Number of voltage sags/dips in phase L1" msgstr "Aantal spanningsdippen in fase L1" msgid "Number of voltage sags/dips in phase L2 (polyphase meters only)" -msgstr "Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage sags/dips in phase L3 (polyphase meters only)" -msgstr "Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L1" msgstr "Aantal spanningspieken in fase L1" msgid "Number of voltage swells in phase L2 (polyphase meters only)" -msgstr "Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L3 (polyphase meters only)" -msgstr "Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "" +"Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" msgid "DSMR Meter statistics" msgstr "Meterstatistieken" @@ -225,20 +306,36 @@ msgstr "DSMR-versie 2/3" msgid "Poll P1 port" msgstr "Peil P1 poort" -msgid "Whether we should track the P1 port on your smartmeter. Almost every feature inside this project requires this to be enabled. However, it might be disabled temporarily due to technical reasons, such as data migrations." -msgstr "Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, zoals datamigraties (bij updates)." +msgid "" +"Whether we should track the P1 port on your smartmeter. Almost every feature " +"inside this project requires this to be enabled. However, it might be " +"disabled temporarily due to technical reasons, such as data migrations." +msgstr "" +"Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke " +"functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan " +"desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, " +"zoals datamigraties (bij updates)." msgid "Track meter statistics" msgstr "Houd meterstatistieken bij" -msgid "Whether we should track any extra statistics sent by the meter, such as the number of power failures of voltage dips. Data is not required for core features." -msgstr "Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de basisfunctionaliteit." +msgid "" +"Whether we should track any extra statistics sent by the meter, such as the " +"number of power failures of voltage dips. Data is not required for core " +"features." +msgstr "" +"Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal " +"stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de " +"basisfunctionaliteit." msgid "DSMR version" msgstr "DSMR-versie" -msgid "The DSMR version your meter supports. Version should be printed on meter." -msgstr "De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op de meter." +msgid "" +"The DSMR version your meter supports. Version should be printed on meter." +msgstr "" +"De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op " +"de meter." msgid "COM-port" msgstr "COM-poort" @@ -276,8 +373,11 @@ msgstr "Weergaveconfiguratie" msgid "Archive" msgstr "Archief" -msgid "No data found. It can take up to one day before any data is visible here." -msgstr "Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer gegevens zichtbaar." +msgid "" +"No data found. It can take up to one day before any data is visible here." +msgstr "" +"Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer " +"gegevens zichtbaar." msgid "Select level of detail displayed" msgstr "Selecteer detailniveau" @@ -363,8 +463,12 @@ msgstr "Bekijk repository op Github" msgid "Theme created by" msgstr "Thema gemaakt door" -msgid "No data found. Please make sure the datalogger is up and running and the backend process is running as well." -msgstr "Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het achtergrondproces." +msgid "" +"No data found. Please make sure the datalogger is up and running and the " +"backend process is running as well." +msgstr "" +"Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het " +"achtergrondproces." msgid "Base selection" msgstr "Basisselectie" @@ -378,8 +482,12 @@ msgstr "Alle instellingen" msgid "Setting" msgstr "Instelling" -msgid "This will simply alter the latest backup timestamp displayed above to a week ago." -msgstr "Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up een week in het verleden wordt gezet." +msgid "" +"This will simply alter the latest backup timestamp displayed above to a week " +"ago." +msgstr "" +"Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up " +"een week in het verleden wordt gezet." msgid "Schedule new backup now" msgstr "Plan per direct nieuwe back-up in" @@ -441,14 +549,20 @@ msgstr "Selecteer het soort gegevens dat je wil exporteren." msgid "Day totals" msgstr "Dagtotalen" -msgid "Summary of each day. Contains electricity, gas and costs (if applicable)." -msgstr "Samenvatting van elke dag. Bevat elektriciteit, gas en gemaakte kosten (wanneer van toepassing)." +msgid "" +"Summary of each day. Contains electricity, gas and costs (if applicable)." +msgstr "" +"Samenvatting van elke dag. Bevat elektriciteit, gas en gemaakte kosten " +"(wanneer van toepassing)." msgid "Hour totals" msgstr "Uurtotalen" -msgid "Summary of each hour read. Contains electricity and gas (if applicable)." -msgstr "Samenvatting van elk uur. Bevat elektriciteit en gas (wanneer van toepassing)." +msgid "" +"Summary of each hour read. Contains electricity and gas (if applicable)." +msgstr "" +"Samenvatting van elk uur. Bevat elektriciteit en gas (wanneer van " +"toepassing)." msgid "Select date range start" msgstr "Selecteer startdatum" @@ -472,7 +586,9 @@ msgid "Excel (.CSV)" msgstr "Excel (.CSV)" msgid "Exports the data in Comma Separated Format, which can be read by Excel." -msgstr "Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door Excel." +msgstr "" +"Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door " +"Excel." msgid "Add note for this date" msgstr "Voeg notitie toe voor deze datum" @@ -504,8 +620,35 @@ msgstr "Gas" msgid "Meter statistics" msgstr "Meterstatistieken" -msgid "Tracking meter statistics is disabled. Enable this feature in the datalogger settings to view statistics." -msgstr "Meterstatistieken worden niet bijgehouden. Schakel dit bij de dataloggerinstellingen in om de statistieken weer te geven." +msgid "" +"Tracking meter statistics is disabled. Enable this feature in the datalogger " +"settings to view statistics." +msgstr "" +"Meterstatistieken worden niet bijgehouden. Schakel dit bij de " +"dataloggerinstellingen in om de statistieken weer te geven." + +#| msgid "Meter statistics" +msgid "Usage statistics" +msgstr "Verbruiksstatistieken" + +msgid "Most common electricity consumption" +msgstr "Veelvoorkomend elektriciteitsverbruik" + +msgid "" +"Average calculated among the top five most common electricity consumption " +"read. This might also be the (minimum) constant electricity consumption in " +"your home." +msgstr "" +"Gemiddeld elektriciteitsverbruik berekend over de vijf meest voorkomende " +"waardes. Dit is vaak ook het (minimale) elektriciteitsverbruik van je woning." + +#| msgid "Latest electricity consumption tracked" +msgid "Lowest electricity consumption read" +msgstr "Laagst gemeten elektriciteitsverbruik" + +#| msgid "Latest electricity consumption tracked" +msgid "Highest electricity consumption read" +msgstr "Hoogst gemeten elektriciteitsverbruik" msgid "Current energy prices" msgstr "Huidige energietarieven" @@ -522,8 +665,12 @@ msgstr "Elektriciteit 2 (per kWh)" msgid "Gas (per m3)" msgstr "Gas (per m3)" -msgid "No energy supplier prices found for today. Enable this feature in consumption settings to view prices." -msgstr "Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de verbruiksinstellingen om de prijzen weer te geven." +msgid "" +"No energy supplier prices found for today. Enable this feature in " +"consumption settings to view prices." +msgstr "" +"Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de " +"verbruiksinstellingen om de prijzen weer te geven." msgid "DSMR-reader" msgstr "DSMR-reader" @@ -543,8 +690,12 @@ msgstr "Metingen" msgid "Status regarding the latest data read from your meter." msgstr "Voortgang m.b.t. de meest recente gevens uit je meter." -msgid "It has been a while since the latest meter reading. Your datalogger process might hang or has been crashed." -msgstr "De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het datalogger proces of is deze gecrashed." +msgid "" +"It has been a while since the latest meter reading. Your datalogger " +"process might hang or has been crashed." +msgstr "" +"De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het " +"datalogger proces of is deze gecrashed." msgid "Latest reading" msgstr "Laatste meting" @@ -558,32 +709,53 @@ msgstr "Totaal aantal metingen" msgid "Background" msgstr "Achtergrond" -msgid "Status regarding processing readings, making them visible in other pages and graphs." -msgstr "Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze zichtbaar zijn in andere pagina's en grafieken." +msgid "" +"Status regarding processing readings, making them visible in other pages and " +"graphs." +msgstr "" +"Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze " +"zichtbaar zijn in andere pagina's en grafieken." msgid "Unprocessed readings" msgstr "Onverwerkte metingen" -msgid "There are too many unprocessed readings. Your backend process might hang or has been crashed." -msgstr "Er zijn te veel onverwerkte metingen. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "" +"There are too many unprocessed readings. Your backend process might hang or has been crashed." +msgstr "" +"Er zijn te veel onverwerkte metingen. Mogelijk hangt het " +"achtergrondproces of is deze gecrashed." msgid "Latest electricity consumption tracked" msgstr "Meest recente elektriciteitsverbruik verwerkt" -msgid "It has been a while since electricity consumption was tracked. Your backend process might hang or has been crashed." -msgstr "Het meest recente elektriciteitsverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "" +"It has been a while since electricity consumption was tracked. Your " +"backend process might hang or has been crashed." +msgstr "" +"Het meest recente elektriciteitsverbruik is een tijdje geleden verwerkt. " +"Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest gas consumption tracked" msgstr "Meest recente gasverbruik verwerkt" -msgid "It has been a while since gas consumption was tracked. Your backend process might hang or has been crashed." -msgstr "Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "" +"It has been a while since gas consumption was tracked. Your backend " +"process might hang or has been crashed." +msgstr "" +"Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt " +"het achtergrondproces of is deze gecrashed." msgid "Data availability" msgstr "Beschikbaarheid gegevens" -msgid "Based on readings until this moment. Electricity usage should be always available. Gas usage and electricity return depend on your home situation." -msgstr "Gebaseerd op verwerkte metingen tot nu toe. Elektriciteitsverbruik zou altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering hangen af van je thuissituatie." +msgid "" +"Based on readings until this moment. Electricity usage should be always " +"available. Gas usage and electricity return depend on your home situation." +msgstr "" +"Gebaseerd op verwerkte metingen tot nu toe. Elektriciteitsverbruik zou " +"altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering " +"hangen af van je thuissituatie." msgid "Data type" msgstr "Soort gegevens" @@ -594,12 +766,21 @@ msgstr "Gemeten" msgid "Electricity return" msgstr "Elektriciteitsteruglevering" -msgid "All data below is calculated among all consumption tracked until a day ago. Untracked consumption and any usage of today is not taken into account." -msgstr "Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin niet meegenomen." +msgid "" +"All data below is calculated among all consumption tracked until a day ago. " +"Untracked consumption and any usage of today is not taken into account." +msgstr "" +"Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en " +"met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin " +"niet meegenomen." #, python-format -msgid "Current data displayed averages %(hour_statistics_count)s hour(s), among %(day_statistics_count)s day(s)." -msgstr "Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, verdeeld over %(day_statistics_count)s dag(en)." +msgid "" +"Current data displayed averages %(hour_statistics_count)s hour(s), among " +"%(day_statistics_count)s day(s)." +msgstr "" +"Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, " +"verdeeld over %(day_statistics_count)s dag(en)." #, python-format msgid "Average hourly electricity consumed (in %%)" @@ -619,12 +800,6 @@ msgstr "Elektriciteitsverbruik piek- en daltarief (afgelopen week)" msgid "Electricity tariff ratio (passed month)" msgstr "Elektriciteitsverbruik piek- en daltarief (afgelopen maand)" -msgid "Most common electricity consumption" -msgstr "Veelvoorkomend elektriciteitsverbruik" - -msgid "Average calculated among the top five most common electricity consumption read. This might also be the (minimum) constant electricity consumption in your home." -msgstr "Gemiddeld elektriciteitsverbruik berekend over de vijf meest voorkomende waardes. Dit is vaak ook het (minimale) elektriciteitsverbruik van je woning." - msgid "Trend & statistics" msgstr "Trends & statistieken" @@ -817,14 +992,24 @@ msgstr "Temperatuur (in ℃)" msgid "Track weather" msgstr "Houd weergegevens bij" -msgid "Whether we should track and log outside temperatures using an external service. Current service integrated is Buienradar" -msgstr "Geeft aan of we buitentemperaturen meten via een externe dienst, en ze bijhouden. Huidig gebruikte dienst is Buienradar" +msgid "" +"Whether we should track and log outside temperatures using an external " +"service. Current service integrated is Buienradar" +msgstr "" +"Geeft aan of we buitentemperaturen meten via een externe dienst, en ze " +"bijhouden. Huidig gebruikte dienst is Buienradar" msgid "Buienradar weather station" msgstr "Buienradar weerstation" -msgid "The weather station used to measure and log outside temperatures. Choose one nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of all locations." -msgstr "Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www.buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." +msgid "" +"The weather station used to measure and log outside temperatures. Choose one " +"nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of " +"all locations." +msgstr "" +"Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te " +"slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www." +"buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." msgid "Weather configuration" msgstr "Weergegevensconfiguratie" @@ -854,10 +1039,18 @@ msgstr "Engels" #~ msgstr "Bezig met bijwerken/uitrollen van DSMR-reader" #~ msgid "Please note that this may take a while, depending on your device..." -#~ msgstr "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je apparaat..." - -#~ msgid "Info regarding the version of this application. Automatic updates are not available (mostly due to privacy reasons), but you should be able to update manually." -#~ msgstr "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een nieuwere versie." +#~ msgstr "" +#~ "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je " +#~ "apparaat..." + +#~ msgid "" +#~ "Info regarding the version of this application. Automatic updates are not " +#~ "available (mostly due to privacy reasons), but you should be able to " +#~ "update manually." +#~ msgstr "" +#~ "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk " +#~ "wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een " +#~ "nieuwere versie." #~ msgid "Updates" #~ msgstr "Updates" @@ -884,7 +1077,8 @@ msgstr "Engels" #~ msgstr "Weken in recente historie" #~ msgid "The number of weeks displayed in the recent history overview." -#~ msgstr "Het aantal weken dat getoond wordt in het recente historie overzicht." +#~ msgstr "" +#~ "Het aantal weken dat getoond wordt in het recente historie overzicht." #~ msgid "History" #~ msgstr "Geschiedenis" @@ -910,8 +1104,12 @@ msgstr "Engels" #~ msgid "(in °C)" #~ msgstr "(in °C)" -#~ msgid "Weather tracking is currently disabled. Enable this feature in weather settings to view temperatures (read hourly)." -#~ msgstr "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." +#~ msgid "" +#~ "Weather tracking is currently disabled. Enable this feature in weather " +#~ "settings to view temperatures (read hourly)." +#~ msgstr "" +#~ "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij " +#~ "weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." #~ msgid "Electricity 1 cost (low tariff)" #~ msgstr "Elektriciteit 1 kosten (daltarief)" @@ -925,11 +1123,20 @@ msgstr "Engels" #~ msgid "Theme by" #~ msgstr "Thema door" -#~ msgid "Number of times data read from your meter. Should be updated every 15 seconds." -#~ msgstr "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden uitgevoerd moeten worden." - -#~ msgid "Most data is processed with a small delay, but should take no longer than a minute to update. Gas consumption however, is only updated once a hour." -#~ msgstr "De meeste gegevens worden op de achtergrond verwerkt met een kleine vertraging. Echter zou het verwerken daarvan niet langer dan een minuut moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." +#~ msgid "" +#~ "Number of times data read from your meter. Should be updated every 15 " +#~ "seconds." +#~ msgstr "" +#~ "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden " +#~ "uitgevoerd moeten worden." + +#~ msgid "" +#~ "Most data is processed with a small delay, but should take no longer than " +#~ "a minute to update. Gas consumption however, is only updated once a hour." +#~ msgstr "" +#~ "De meeste gegevens worden op de achtergrond verwerkt met een kleine " +#~ "vertraging. Echter zou het verwerken daarvan niet langer dan een minuut " +#~ "moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." #~ msgid "Based on readings until this moment" #~ msgstr "Gebaseerd op metingen tot nu toe" @@ -941,10 +1148,14 @@ msgstr "Engels" #~ msgstr "Gemiddeld verbruik elektriciteit 2 (piektarief) per daguur in kWh" #~ msgid "Average hourly electricity 1 return (low tariff) yield in kWh" -#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) per daguur in kWh" +#~ msgstr "" +#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) " +#~ "per daguur in kWh" #~ msgid "Average hourly electricity 2 return (high tariff) yield in kWh" -#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 (piektarief) per daguur in kWh" +#~ msgstr "" +#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 " +#~ "(piektarief) per daguur in kWh" #~ msgid "Average hourly electricity demand in Watt" #~ msgstr "Gemiddelde elektriciteitsvraag per daguur in Watt" @@ -959,7 +1170,8 @@ msgstr "Engels" #~ msgstr "Dagelijks elektriciteitsverbruik in de afgelopen %(days_ago)s dagen" #~ msgid "Daily electricity returned in the past %(days_ago)s days" -#~ msgstr "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" +#~ msgstr "" +#~ "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" #~ msgid "Daily gas usage in the past %(days_ago)s days" #~ msgstr "Dagelijks gasverbruik in de afgelopen %(days_ago)s dagen" @@ -994,38 +1206,67 @@ msgstr "Engels" #~ msgid "Compacts existing DSMR readings into consumption points." #~ msgstr "Voegt bestaande DSMR uitlezingen samen in verbruiksgegevens." -#~ msgid "The max number of readings to compact this run (default: %(default)s)" -#~ msgstr "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt (standaard: %(default)s)" +#~ msgid "" +#~ "The max number of readings to compact this run (default: %(default)s)" +#~ msgstr "" +#~ "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt " +#~ "(standaard: %(default)s)" #~ msgid "DEPRECATED: Moved to settings in database." #~ msgstr "UITGEFASEERD: Instellingen zijn verplaatst naar de database." -#~ msgid "Purges all consumption data (DELETES IT!) and marks all readings as unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL HISTORIC READINGS!" -#~ msgstr "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" - -#~ msgid "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_backend" -#~ msgstr "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_backend" +#~ msgid "" +#~ "Purges all consumption data (DELETES IT!) and marks all readings as " +#~ "unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL " +#~ "HISTORIC READINGS!" +#~ msgstr "" +#~ "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle " +#~ "uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van " +#~ "groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" + +#~ msgid "" +#~ "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please " +#~ "use dsmr_backend" +#~ msgstr "" +#~ "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik " +#~ "alsjeblieft dsmr_backend" #~ msgid "Polls the serial port for DSMR telegram and performs a reading." #~ msgstr "Controleert de seriele poort voor DSMR-gegevens en leest deze uit." #~ msgid "COM-port connected to Smartmeter (default: %(default)s)" -#~ msgstr "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" - -#~ msgid "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_datalogger" -#~ msgstr "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_datalogger" - -#~ msgid "Your current trends and statistics settings do not allow to track trends! You should enable it to have accurate (or any) data below." -#~ msgstr "Je huidige trends- en statistiekeninstellingen staan niet toe om trends bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder te zien." - -#~ msgid "Trends might be recalculated retroactively, depending on whether all historic DSMR source readings are still available." -#~ msgstr "Trends kunnen met terugwerkende kracht berekend worden, mits alle historische DSMR-uitlezingen nog beschikbaar zijn." +#~ msgstr "" +#~ "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" + +#~ msgid "" +#~ "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please " +#~ "use dsmr_datalogger" +#~ msgstr "" +#~ "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik " +#~ "alsjeblieft dsmr_datalogger" + +#~ msgid "" +#~ "Your current trends and statistics settings do not allow to track trends! " +#~ "You should enable it to have accurate (or any) data below." +#~ msgstr "" +#~ "Je huidige trends- en statistiekeninstellingen staan niet toe om trends " +#~ "bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder " +#~ "te zien." + +#~ msgid "" +#~ "Trends might be recalculated retroactively, depending on whether all " +#~ "historic DSMR source readings are still available." +#~ msgstr "" +#~ "Trends kunnen met terugwerkende kracht berekend worden, mits alle " +#~ "historische DSMR-uitlezingen nog beschikbaar zijn." #~ msgid "Track trends" #~ msgstr "Houd trends bij" -#~ msgid "Whether we should track trends by storing daily consumption summaries." -#~ msgstr "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." +#~ msgid "" +#~ "Whether we should track trends by storing daily consumption summaries." +#~ msgstr "" +#~ "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." #~ msgid "Trends & statistics configuration" #~ msgstr "Trends- & statistiekenconfiguratie" @@ -1033,14 +1274,21 @@ msgstr "Engels" #~ msgid "Value" #~ msgstr "Waarde" -#~ msgid "This page displays all settings and the status of them. You can change them here" -#~ msgstr "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je kunt ze hier veranderen" +#~ msgid "" +#~ "This page displays all settings and the status of them. You can change " +#~ "them here" +#~ msgstr "" +#~ "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je " +#~ "kunt ze hier veranderen" #~ msgid "BAUD rate" #~ msgstr "BAUD-waarde" -#~ msgid "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" -#~ msgstr "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 voor oudere versies" +#~ msgid "" +#~ "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" +#~ msgstr "" +#~ "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 " +#~ "voor oudere versies" #~ msgid "GRAPH_SHORT_DATETIME l, P" #~ msgstr "GRAPH_SHORT_DATETIME l G:i" @@ -1054,8 +1302,16 @@ msgstr "Engels" #~ msgid "Miscellaneous statistics" #~ msgstr "Overige statistieken" -#~ msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." -#~ msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor hoogtarief." +#~ msgid "" +#~ "Tariff indicator electricity. The tariff indicator can be used to switch " +#~ "tariff dependent loads e.g boilers. This is responsibility of the P1 " +#~ "user. Note: Tariff code 1 is used for low tariff and tariff code 2 is " +#~ "used for normal tariff." +#~ msgstr "" +#~ "Tariefindicatie. Dit kan gebruikt worden om te wisselen met " +#~ "tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording " +#~ "is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " +#~ "daltarief en tariefcode 2 voor hoogtarief." #~ msgid "Electricity 2" #~ msgstr "Elektriciteit 2" From 99cc5d10e3bfb0070949b3c3cc1c7d3bb2cef541 Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Wed, 18 May 2016 21:10:38 +0200 Subject: [PATCH 12/13] Reset day & hour statistics when changing energy prices #95 --- docs/changelog.rst | 1 + docs/faq.rst | 18 + docs/index.rst | 1 + docs/locale/nl/LC_MESSAGES/changelog.po | 272 ++++++---- docs/locale/nl/LC_MESSAGES/credits.po | 36 +- docs/locale/nl/LC_MESSAGES/faq.mo | Bin 0 -> 1830 bytes docs/locale/nl/LC_MESSAGES/faq.po | 67 +++ dsmr_consumption/services.py | 1 - dsmr_stats/management/__init__.py | 0 dsmr_stats/management/commands/__init__.py | 0 .../commands/dsmr_stats_clear_statistics.py | 26 + dsmr_stats/services.py | 6 + dsmr_stats/tests/test_management_command.py | 17 + dsmr_stats/tests/test_services.py | 21 + dsmrreader/__init__.py | 2 +- dsmrreader/locales/nl/LC_MESSAGES/django.mo | Bin 27283 -> 27866 bytes dsmrreader/locales/nl/LC_MESSAGES/django.po | 502 +++++------------- 17 files changed, 495 insertions(+), 475 deletions(-) create mode 100644 docs/faq.rst create mode 100644 docs/locale/nl/LC_MESSAGES/faq.mo create mode 100644 docs/locale/nl/LC_MESSAGES/faq.po create mode 100644 dsmr_stats/management/__init__.py create mode 100644 dsmr_stats/management/commands/__init__.py create mode 100644 dsmr_stats/management/commands/dsmr_stats_clear_statistics.py create mode 100644 dsmr_stats/tests/test_management_command.py diff --git a/docs/changelog.rst b/docs/changelog.rst index 3fcf32cb0..a34df0c3e 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -13,6 +13,7 @@ v1.2.0 - 2016-xx-xx - Pie charts on trends page overlap their canvas (`#136 `_). - 'Slumber' consumption (`#115 `_). - Show lowest & highest Watt peaks (`#138 `_). +- Reset day & hour statistics when changing energy prices (`#95 `_). v1.1.2 - 2016-05-01 diff --git a/docs/faq.rst b/docs/faq.rst new file mode 100644 index 000000000..ac560fde1 --- /dev/null +++ b/docs/faq.rst @@ -0,0 +1,18 @@ +Frequently Asked Questions (FAQ) +================================ + +Feature/bug report +------------------ +**How can I propose a feature or report a bug I've found?** + +`Just create a ticket at Github `_ + +Recalculate prices +------------------ +**I've adjusted my energy prices but there are no changes! How can I regenerate them with my new prices?** + +*You can flush your statistics by executing:* + +``./manage.py dsmr_stats_clear_statistics --ack-to-delete-my-data`` + +*The application will delete all statistics and (slowly) regenerate them in the background. Just make sure the source data is still there.* \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index d8d438fac..dfad44172 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,6 +8,7 @@ DSMR Reader's documentation screenshots installation application + faq changelog contributing credits diff --git a/docs/locale/nl/LC_MESSAGES/changelog.po b/docs/locale/nl/LC_MESSAGES/changelog.po index e548d0a40..67dcab8d9 100644 --- a/docs/locale/nl/LC_MESSAGES/changelog.po +++ b/docs/locale/nl/LC_MESSAGES/changelog.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-23 17:05+0200\n" +"POT-Creation-Date: 2016-05-18 21:04+0200\n" "PO-Revision-Date: 2016-04-18 22:10+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" @@ -16,518 +16,607 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.2.0\n" -"Language: nl\n" #: ../../changelog.rst:2 msgid "Changelog" msgstr "Wijzigingenoverzicht" -#: ../../changelog.rst:5 -msgid "v1.1.0 - 2016-xx-xx" +#: ../../changelog.rst:6 +msgid "v1.2.0 - 2016-xx-xx" msgstr "" -#: ../../changelog.rst:6 +#: ../../changelog.rst:7 +msgid "" +"Energy supplier prices does not indicate tariff type (Django admin) " +"(`#126 `_)." +msgstr "" + +#: ../../changelog.rst:8 +msgid "" +"Requirements update (`#128 `_)." +msgstr "" + +#: ../../changelog.rst:9 +msgid "" +"Force backup (`#123 `_)." +msgstr "" + +#: ../../changelog.rst:10 +msgid "" +"Update clean-install.md (`#131 `_)." +msgstr "" + +#: ../../changelog.rst:11 +msgid "" +"Improve data export field names (`#132 " +"`_)." +msgstr "" + +#: ../../changelog.rst:12 +msgid "" +"Display average temperature in archive (`#122 " +"`_)." +msgstr "" + +#: ../../changelog.rst:13 +msgid "" +"Pie charts on trends page overlap their canvas (`#136 " +"`_)." +msgstr "" + +#: ../../changelog.rst:14 +msgid "" +"'Slumber' consumption (`#115 `_)." +msgstr "" + +#: ../../changelog.rst:15 +msgid "" +"Show lowest & highest Watt peaks (`#138 " +"`_)." +msgstr "" + +#: ../../changelog.rst:16 +msgid "" +"Reset day & hour statistics when changing energy prices (`#95 " +"`_)." +msgstr "" + +#: ../../changelog.rst:20 +msgid "v1.1.2 - 2016-05-01" +msgstr "" + +#: ../../changelog.rst:21 +msgid "" +"Trends page giving errors (when lacking data) (`#125 " +"`_)." +msgstr "" + +#: ../../changelog.rst:25 +msgid "v1.1.1 - 2016-04-27" +msgstr "" + +#: ../../changelog.rst:26 +msgid "" +"Improve readme (`#124 `_)." +msgstr "" + +#: ../../changelog.rst:30 +msgid "v1.1.0 - 2016-04-23" +msgstr "" + +#: ../../changelog.rst:31 msgid "" "Autorefresh dashboard (`#117 `_)." msgstr "" -#: ../../changelog.rst:7 +#: ../../changelog.rst:32 msgid "" "Improve line graphs' visibility (`#111 " "`_)." msgstr "" -#: ../../changelog.rst:8 +#: ../../changelog.rst:33 msgid "" "Easily add notes (`#110 `_)." msgstr "" -#: ../../changelog.rst:9 +#: ../../changelog.rst:34 msgid "" "Export data points in CSV format (`#2 `_)." msgstr "" -#: ../../changelog.rst:10 +#: ../../changelog.rst:35 msgid "" "Allow day/month/year comparison (`#94 `_)." msgstr "" -#: ../../changelog.rst:11 +#: ../../changelog.rst:36 msgid "" "Docs: Add FAQ and generic application info (`#113 " "`_)." msgstr "" -#: ../../changelog.rst:15 +#: ../../changelog.rst:37 +msgid "" +"Support for Iskra meter (DSMR 2.x) (`#120 " +"`_)." +msgstr "" + +#: ../../changelog.rst:41 msgid "v1.0.1 - 2016-04-07" msgstr "" -#: ../../changelog.rst:16 +#: ../../changelog.rst:42 msgid "" "Update licence to OSI compatible one (`#119 " "`_)." msgstr "" -#: ../../changelog.rst:20 +#: ../../changelog.rst:46 msgid "v1.0.0 - 2016-04-07" msgstr "" -#: ../../changelog.rst:21 +#: ../../changelog.rst:47 msgid "First official stable release." msgstr "Eerste officiële stabiele release." -#: ../../changelog.rst:25 +#: ../../changelog.rst:51 msgid "[β] v0.1 (2015-10-29) to 0.16 (2016-04-06)" msgstr "" -#: ../../changelog.rst:26 +#: ../../changelog.rst:52 msgid "" "All previous beta releases/changes have been combined to a single list " "below:" msgstr "" -#: ../../changelog.rst:28 +#: ../../changelog.rst:54 msgid "" "Move documentation to wiki or RTD (`#90 " "`_)." msgstr "" -#: ../../changelog.rst:29 +#: ../../changelog.rst:55 msgid "" "Translate README to Dutch (`#16 `_)." msgstr "" -#: ../../changelog.rst:30 +#: ../../changelog.rst:56 msgid "" "Delete (recent) history page (`#112 `_)." msgstr "" -#: ../../changelog.rst:31 +#: ../../changelog.rst:57 msgid "" "Display most recent temperature in dashboard (`#114 " "`_)." msgstr "" -#: ../../changelog.rst:32 +#: ../../changelog.rst:58 msgid "" "Upgrade Django to 1.8.12 (`#118 `_)." msgstr "" -#: ../../changelog.rst:34 +#: ../../changelog.rst:60 msgid "" "Redesign trends page (`#97 `_)." msgstr "" -#: ../../changelog.rst:35 +#: ../../changelog.rst:61 msgid "" "Support for summer time (`#105 `_)." msgstr "" -#: ../../changelog.rst:36 +#: ../../changelog.rst:62 msgid "" "Support for Daylight Saving Time (DST) transition (`#104 " "`_)." msgstr "" -#: ../../changelog.rst:37 +#: ../../changelog.rst:63 msgid "" "Add (error) hints to status page (`#106 " "`_)." msgstr "" -#: ../../changelog.rst:38 +#: ../../changelog.rst:64 msgid "" "Keep track of version (`#108 `_)." msgstr "" -#: ../../changelog.rst:40 +#: ../../changelog.rst:66 msgid "" "Django 1.8.11 released (`#82 `_)." msgstr "" -#: ../../changelog.rst:41 +#: ../../changelog.rst:67 msgid "" "Prevent tests from failing due to moment of execution (`#88 " "`_)." msgstr "" -#: ../../changelog.rst:42 +#: ../../changelog.rst:68 msgid "" "Statistics page meter positions are broken (`#93 " "`_)." msgstr "" -#: ../../changelog.rst:43 +#: ../../changelog.rst:69 msgid "" "Archive only shows graph untill 23:00 (11 pm) (`#77 " "`_)." msgstr "" -#: ../../changelog.rst:44 +#: ../../changelog.rst:70 msgid "" "Trends page crashes due to nullable fields average (`#100 " "`_)." msgstr "" -#: ../../changelog.rst:45 +#: ../../changelog.rst:71 msgid "" "Trends: Plot peak and off-peak relative to each other (`#99 " "`_)." msgstr "" -#: ../../changelog.rst:46 +#: ../../changelog.rst:72 msgid "" "Monitor requirements with requires.io (`#101 " "`_)." msgstr "" -#: ../../changelog.rst:47 +#: ../../changelog.rst:73 msgid "" "Terminology (`#41 `_)." msgstr "" -#: ../../changelog.rst:48 +#: ../../changelog.rst:74 msgid "" "Obsolete signals in dsmr_consumption (`#63 " "`_)." msgstr "" -#: ../../changelog.rst:49 +#: ../../changelog.rst:75 msgid "" "Individual app testing coverage (`#64 `_)." msgstr "" -#: ../../changelog.rst:50 +#: ../../changelog.rst:76 msgid "" "Support for extra devices on other M-bus (0-n:24.1) (`#92 " "`_)." msgstr "" -#: ../../changelog.rst:51 +#: ../../changelog.rst:77 msgid "" "Separate post-deployment commands (`#102 " "`_)." msgstr "" -#: ../../changelog.rst:53 +#: ../../changelog.rst:79 msgid "" "Show exceptions in production (webinterface) (`#87 " "`_)." msgstr "" -#: ../../changelog.rst:54 +#: ../../changelog.rst:80 msgid "" "Keep Supervisor processes running (`#79 " "`_)." msgstr "" -#: ../../changelog.rst:55 +#: ../../changelog.rst:81 msgid "" "Hourly stats of 22:00:00+00 every day lack gas (`#78 " "`_)." msgstr "" -#: ../../changelog.rst:56 +#: ../../changelog.rst:82 msgid "" "Test Travis-CI with MySQL + MariaDB + PostgreSQL (`#54 " "`_)." msgstr "" -#: ../../changelog.rst:57 +#: ../../changelog.rst:83 msgid "" "PostgreSQL tests + nosetests + coverage failure: unrecognized " "configuration parameter \"foreign_key_checks\" (`#62 " "`_)." msgstr "" -#: ../../changelog.rst:58 +#: ../../changelog.rst:84 msgid "" "Performance check (`#83 `_)." msgstr "" -#: ../../changelog.rst:59 +#: ../../changelog.rst:85 msgid "" "Allow month & year archive (`#66 `_)." msgstr "" -#: ../../changelog.rst:60 +#: ../../changelog.rst:86 msgid "" "Graphs keep increasing height on tablet (`#89 " "`_)." msgstr "" -#: ../../changelog.rst:62 +#: ../../changelog.rst:88 msgid "" "Delete StatsSettings(.track) settings model (`#71 " "`_)." msgstr "" -#: ../../changelog.rst:63 +#: ../../changelog.rst:89 msgid "" "Drop deprecated commands (`#22 `_)." msgstr "" -#: ../../changelog.rst:64 +#: ../../changelog.rst:90 msgid "" "Datalogger doesn't work properly with DSMR 4.2 (KAIFA-METER) (`#73 " "`_)." msgstr "" -#: ../../changelog.rst:65 +#: ../../changelog.rst:91 msgid "" "Dashboard month statistics costs does not add up (`#75 " "`_)." msgstr "" -#: ../../changelog.rst:66 +#: ../../changelog.rst:92 msgid "" "Log unhandled exceptions and errors (`#65 " "`_)." msgstr "" -#: ../../changelog.rst:67 +#: ../../changelog.rst:93 msgid "" "Datalogger crashes with IntegrityError because 'timestamp' is null (`#74 " "`_)." msgstr "" -#: ../../changelog.rst:68 +#: ../../changelog.rst:94 msgid "" "Trends are always shown in UTC (`#76 `_)." msgstr "" -#: ../../changelog.rst:69 +#: ../../changelog.rst:95 msgid "" "Squash migrations (`#31 `_)." msgstr "" -#: ../../changelog.rst:70 +#: ../../changelog.rst:96 msgid "" "Display 'electricity returned' graph in dashboard (`#81 " "`_)." msgstr "" -#: ../../changelog.rst:71 +#: ../../changelog.rst:97 msgid "" "Optional gas (and electricity returned) capabilities tracking (`#70 " "`_)." msgstr "" -#: ../../changelog.rst:72 +#: ../../changelog.rst:98 msgid "" "Add 'electricity returned' to trends page (`#84 " "`_)." msgstr "" -#: ../../changelog.rst:74 +#: ../../changelog.rst:100 msgid "" "Archive: View past days details (`#61 `_)." msgstr "" -#: ../../changelog.rst:75 +#: ../../changelog.rst:101 msgid "" "Dashboard: Consumption total for current month (`#60 " "`_)." msgstr "" -#: ../../changelog.rst:76 +#: ../../changelog.rst:102 msgid "" "Check whether gas readings are optional (`#34 " "`_)." msgstr "" -#: ../../changelog.rst:77 +#: ../../changelog.rst:103 msgid "" "Django security releases issued: 1.8.10 (`#68 " "`_)." msgstr "" -#: ../../changelog.rst:78 +#: ../../changelog.rst:104 msgid "" "Notes display in archive (`#69 `_)." msgstr "" -#: ../../changelog.rst:80 +#: ../../changelog.rst:106 msgid "" "Status page/alerts when features are disabled/unavailable (`#45 " "`_)." msgstr "" -#: ../../changelog.rst:81 +#: ../../changelog.rst:107 msgid "" "Integrate Travis CI (`#48 `_)." msgstr "" -#: ../../changelog.rst:82 +#: ../../changelog.rst:108 msgid "" "Testing coverage (`#38 `_)." msgstr "" -#: ../../changelog.rst:83 +#: ../../changelog.rst:109 msgid "" "Implement automatic backups & Dropbox cloud storage (`#44 " "`_)." msgstr "" -#: ../../changelog.rst:84 +#: ../../changelog.rst:110 msgid "" "Link code coverage service to repository (`#56 " "`_)." msgstr "" -#: ../../changelog.rst:85 +#: ../../changelog.rst:111 msgid "" "Explore timezone.localtime() as replacement for datetime.astimezone() " "(`#50 `_)." msgstr "" -#: ../../changelog.rst:86 +#: ../../changelog.rst:112 msgid "" "Align GasConsumption.read_at to represent the start of hour (`#40 " "`_)." msgstr "" -#: ../../changelog.rst:88 +#: ../../changelog.rst:114 msgid "" "Cleanup unused static files (`#47 `_)." msgstr "" -#: ../../changelog.rst:89 +#: ../../changelog.rst:115 msgid "" "Investigated mysql_tzinfo_to_sql — Load the Time Zone Tables (`#35 " "`_)." msgstr "" -#: ../../changelog.rst:90 +#: ../../changelog.rst:116 msgid "" "Make additional DSMR data optional (`#46 " "`_)." msgstr "" -#: ../../changelog.rst:91 +#: ../../changelog.rst:117 msgid "" "Localize graph x-axis (`#42 `_)." msgstr "" -#: ../../changelog.rst:92 +#: ../../changelog.rst:118 msgid "" "Added graph formatting string to gettext file (`#42 " "`_)." msgstr "" -#: ../../changelog.rst:93 +#: ../../changelog.rst:119 msgid "" "Different colors for peak & off-peak electricity (`#52 " "`_)." msgstr "" -#: ../../changelog.rst:94 +#: ../../changelog.rst:120 msgid "" "Admin: Note widget (`#51 `_)." msgstr "" -#: ../../changelog.rst:95 +#: ../../changelog.rst:121 msgid "" "Allow GUI to run without data (`#26 `_)." msgstr "" -#: ../../changelog.rst:97 +#: ../../changelog.rst:123 msgid "" "Moved project to GitHub (`#28 `_)." msgstr "" -#: ../../changelog.rst:98 +#: ../../changelog.rst:124 msgid "Added stdout to dsmr_backend to reflect progress." msgstr "" -#: ../../changelog.rst:99 +#: ../../changelog.rst:125 msgid "" "Restore note usage in GUI (`#39 `_)." msgstr "" -#: ../../changelog.rst:101 +#: ../../changelog.rst:127 msgid "" "Store daily, weekly, monthly and yearly statistics (`#3 " "`_)." msgstr "" -#: ../../changelog.rst:102 +#: ../../changelog.rst:128 msgid "" "Improved Recent History page performance a bit. (as result of `#3 " "`_)" msgstr "" -#: ../../changelog.rst:103 +#: ../../changelog.rst:129 msgid "" "Updates ChartJS library tot 1.1, disposing django-chartjs plugin. Labels " "finally work! (as result of `#3 `_)" msgstr "" -#: ../../changelog.rst:104 +#: ../../changelog.rst:130 msgid "" "Added trends page. (as result of `#3 `_)" msgstr "" -#: ../../changelog.rst:106 +#: ../../changelog.rst:132 msgid "" "Recent history setting: set range (`#29 " "`_)." msgstr "" -#: ../../changelog.rst:107 +#: ../../changelog.rst:133 msgid "" "Mock required for test: dsmr_weather.test_weather_tracking (`#32 " "`_)." msgstr "" -#: ../../changelog.rst:109 +#: ../../changelog.rst:135 msgid "" "Massive refactoring: Separating apps & using signals (`#19 " "`_)." msgstr "" -#: ../../changelog.rst:110 +#: ../../changelog.rst:136 msgid "" "README update: Exit character for cu (`#27 " "`_, by Jeroen " "Peters)." msgstr "" -#: ../../changelog.rst:111 +#: ../../changelog.rst:137 msgid "Fixed untranslated strings in admin interface." msgstr "" -#: ../../changelog.rst:112 +#: ../../changelog.rst:138 msgid "Upgraded Django to 1.8.9." msgstr "" @@ -771,3 +860,6 @@ msgstr "" #~ msgid "First stable release." #~ msgstr "" +#~ msgid "v1.1.0 - 2016-xx-xx" +#~ msgstr "" + diff --git a/docs/locale/nl/LC_MESSAGES/credits.po b/docs/locale/nl/LC_MESSAGES/credits.po index 0e274ea20..68e0bb33d 100644 --- a/docs/locale/nl/LC_MESSAGES/credits.po +++ b/docs/locale/nl/LC_MESSAGES/credits.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: DSMR Reader 1.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-23 17:05+0200\n" +"POT-Creation-Date: 2016-05-18 21:04+0200\n" "PO-Revision-Date: 2016-04-07 20:22+0100\n" "Last-Translator: Dennis Siemensma \n" "Language-Team: Dennis Siemensma \n" @@ -16,7 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.2.0\n" -"Language: nl\n" #: ../../credits.rst:2 msgid "Credits" @@ -107,11 +106,17 @@ msgstr "`Read The Docs `_" msgid "`MW `_" msgstr "`MW `_" -#: ../../credits.rst:41 +#: ../../credits.rst:40 +msgid "" +"`Full Page Screen Capture `_" +msgstr "" + +#: ../../credits.rst:44 msgid "Testers & contributors" msgstr "Testers & mensen met bijdrage" -#: ../../credits.rst:43 +#: ../../credits.rst:46 msgid "" "`Jeroen Peters `_ (`Github " "profile `_)" @@ -119,7 +124,7 @@ msgstr "" "`Jeroen Peters `_ (`Github " "profile `_)" -#: ../../credits.rst:44 +#: ../../credits.rst:47 msgid "" "`Daniel ter Horst `_ (`Github" " profile `_)" @@ -127,7 +132,7 @@ msgstr "" "`Daniel ter Horst `_ (`Github" " profile `_)" -#: ../../credits.rst:45 +#: ../../credits.rst:48 #, fuzzy msgid "" "`Sander de Leeuw `_" @@ -136,27 +141,32 @@ msgstr "" "`Jeroen Peters `_ (`Github " "profile `_)" -#: ../../credits.rst:46 +#: ../../credits.rst:49 +#, fuzzy +msgid "\"WatskeBart\" (`Github profile `_)" +msgstr "`Github `_" + +#: ../../credits.rst:50 msgid "`Gert Schaafsma `_" msgstr "`Gert Schaafsma `_" -#: ../../credits.rst:47 +#: ../../credits.rst:51 msgid "`Bert-Jan Vos `_" msgstr "`Bert-Jan Vos `_" -#: ../../credits.rst:51 +#: ../../credits.rst:55 msgid "DSMR help" msgstr "DSMR hulp" -#: ../../credits.rst:53 +#: ../../credits.rst:57 msgid "Dutch Smart Meter reading specifications, data cables, examples and hints:" msgstr "Dutch Smart Meter reading specifications, data cables, examples and hints:" -#: ../../credits.rst:55 +#: ../../credits.rst:59 msgid "`Gé Janssen `_" msgstr "`Gé Janssen `_" -#: ../../credits.rst:57 +#: ../../credits.rst:61 msgid "" "`Joost van der Linde " "`_" @@ -164,7 +174,7 @@ msgstr "" "`Joost van der Linde " "`_" -#: ../../credits.rst:59 +#: ../../credits.rst:63 msgid "`SOS Solutions `_" msgstr "`SOS Solutions `_" diff --git a/docs/locale/nl/LC_MESSAGES/faq.mo b/docs/locale/nl/LC_MESSAGES/faq.mo new file mode 100644 index 0000000000000000000000000000000000000000..7b0a9c2b7310d0ac74f0a7474de06060d3c88729 GIT binary patch literal 1830 zcmd5+%Wfk@6fIzQSz^*E)u|R?!Va2zw-~$kBV9TktLjvLhXzA*7Ro}XgQ}^`Gckg^B@HAkr!*bXwu%BS@ z`3<%W`yDod$!CQ42KYTt0^fXAh`Yc`AOU%~{u=lN);|FEfqw$$IJ5nn5cjeE@s1D` z@K@ls!1Q?`j(~pvUj;sRL5SCY7fT!iKgaqjV2t+*5a9$sya;<4hEU=qSnTEcK{|nu z^@9?GSX+DFPAO4_PN;OYw4O=PfK{j*lXc{{v@T$;UuAUi)`V$bE0eyrwuZCyTBW1P z2TrM&5gT^d43Tug9!CO&AtR828B57fnT-7#bd%I^77wYw(Y2td4#OD9@N^lbPSqVE zNLl7OQ9)Y+w>+nmbH+J^S0AwNgHAjtlhTUM?KGdQqWph`*CwW+zDmZKi;XntF{-CR zjhTGxIezxGatTwaf+Fn^JZ8fO$4#{TsjX_p26^R&G=uN$^nI}Kl#?oGlXcd_(SpiW zq;J8cICA`D#U|u4+Vf)&cTq7?SmSBsXzyZGTymoFq{<^H3o1pgt}=0m7B2{mjv2QS z=ooxeecBm@Q2I`*mDTHJVvAPF#%S*~7i@f?TB$FbM1+)G3;Rgg0?WI-E79vUTZJ+z z<7PRd=yw$f^;b#GYVp1#S4uD^gOv;JWigYHrCv{*J3Hbe$dgol%+8~o4jnu>yQIrH zBds^vjmvtNrpb44)?^i!kX=?q zhfeoCIR0qw_>gu^Pao#GXB6hE|y?ZMNggJI~=k z6$Wza#xE8(U?&evV$(P(wAI(4al8}*=$Uosk?M0!8_f-5_(U$h#eU8$r#gVs&E`9e zTEt9ah**z_+0caD-13;TNi_l*vV(db(#5EAj=q-y9@CKfG`FJ)7fgj7nT3WmWAH|E z992=WB?x^RB2g};m}{nNna3wXokv0cT|f${Yp$mC?A9StYu&^`J&UXdx1`Lm)~Oz0 zCNa)=4(;728QE*~a{M@FTFFt%T&ZG}rr0A};ukUP0 z#O=c&!{1;6F@Tt$62wHmQPGc4d}RWSZqoC3!Q-MfyvHU$RzTPsRUvVO8-N-Yok8jt z`^b9h7R%UUc;oj7&S~N>S7s^l^CiEwtl6SI_(4uKqIag$;vTPMj+;fV{~M|Q1xndH AeE, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: DSMR Reader 1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-05-18 21:05+0200\n" +"PO-Revision-Date: 2016-05-18 21:07+0100\n" +"Last-Translator: Dennis Siemensma \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.2.0\n" +"X-Generator: Poedit 1.5.4\n" + +#: ../../faq.rst:2 +msgid "Frequently Asked Questions (FAQ)" +msgstr "Veelgestelde vragen (FAQ)" + +#: ../../faq.rst:5 +msgid "Feature/bug report" +msgstr "Verzoek/fout melden" + +#: ../../faq.rst:6 +msgid "**How can I propose a feature or report a bug I've found?**" +msgstr "**Hoe kan ik een verzoek indienen of een fout melden?**" + +#: ../../faq.rst:8 +msgid "" +"`Just create a ticket at Github `_" +msgstr "" +"`Maak een ticket aan op Github `_" + +#: ../../faq.rst:11 +msgid "Recalculate prices" +msgstr "Prijzen opnieuw berekenen" + +#: ../../faq.rst:12 +msgid "" +"**I've adjusted my energy prices but there are no changes! How can I " +"regenerate them with my new prices?**" +msgstr "" +"**Ik heb zojuist mijn energieprijzen aangepast, maar ik zie geen verschil! " +"Hoe kan ik de nieuwe prijzen doorvoeren?**" + +#: ../../faq.rst:14 +msgid "*You can flush your statistics by executing:*" +msgstr "*Je kunt je statistieken verwijderen door het volgende uit te voeren:*" + +#: ../../faq.rst:16 +msgid "``./manage.py dsmr_stats_clear_statistics --ack-to-delete-my-data``" +msgstr "``./manage.py dsmr_stats_clear_statistics --ack-to-delete-my-data``" + +#: ../../faq.rst:18 +msgid "" +"*The application will delete all statistics and (slowly) regenerate them in " +"the background. Just make sure the source data is still there.*" +msgstr "" +"*De applicatie verwijdert alle statistics en genereert ze (langzaam) weer op " +"de achtergrond. Zorg er wel voor dat alle brongegevens intact zijn.*" diff --git a/dsmr_consumption/services.py b/dsmr_consumption/services.py index 50c3eeac0..97267bde0 100644 --- a/dsmr_consumption/services.py +++ b/dsmr_consumption/services.py @@ -241,5 +241,4 @@ def calculate_min_max_consumption_watt(): if min_max[x]: min_max[x] = int(min_max[x] * 1000) - print(min_max) return min_max diff --git a/dsmr_stats/management/__init__.py b/dsmr_stats/management/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dsmr_stats/management/commands/__init__.py b/dsmr_stats/management/commands/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/dsmr_stats/management/commands/dsmr_stats_clear_statistics.py b/dsmr_stats/management/commands/dsmr_stats_clear_statistics.py new file mode 100644 index 000000000..fa2f8f06a --- /dev/null +++ b/dsmr_stats/management/commands/dsmr_stats_clear_statistics.py @@ -0,0 +1,26 @@ +from django.core.management.base import BaseCommand, CommandError +from django.utils.translation import ugettext as _ + +import dsmr_stats.services + + +class Command(BaseCommand): + help = _('Clears all statistics generated. Use this to regenerate them after altering prices.') + + def add_arguments(self, parser): + super(Command, self).add_arguments(parser) + parser.add_argument( + '--ack-to-delete-my-data', + action='store_true', + dest='acked_warning', + default=False, + help=_('Required to acknowledge you that you WILL delete your statistics with this.') + ) + + def handle(self, **options): + if not options.get('acked_warning'): + raise CommandError(_( + 'Intended usage is NOT production! Force by using --ack-to-delete-my-data' + )) + + dsmr_stats.services.clear_statistics() diff --git a/dsmr_stats/services.py b/dsmr_stats/services.py index bd7f58976..e1a11b1a1 100644 --- a/dsmr_stats/services.py +++ b/dsmr_stats/services.py @@ -143,6 +143,12 @@ def create_hourly_statistics(hour_start): HourStatistics.objects.create(**creation_kwargs) +def clear_statistics(): + """ Clears ALL statistics ever generated. """ + DayStatistics.objects.all().delete() + HourStatistics.objects.all().delete() + + def electricity_tariff_percentage(start_date): """ Returns the total electricity consumption percentage by tariff (high/low tariff). """ totals = DayStatistics.objects.filter(day__gte=start_date).aggregate( diff --git a/dsmr_stats/tests/test_management_command.py b/dsmr_stats/tests/test_management_command.py new file mode 100644 index 000000000..c32dfee5a --- /dev/null +++ b/dsmr_stats/tests/test_management_command.py @@ -0,0 +1,17 @@ +from unittest import mock + +from django.test.testcases import TestCase +from django.core.management.base import CommandError + +from dsmr_backend.tests.mixins import InterceptStdoutMixin + + +class TestManagementCommand(InterceptStdoutMixin, TestCase): + def test_dsmr_stats_clear_statistics(self): + with self.assertRaisesMessage(CommandError, 'Intended usage is NOT production! Force by using --ack-to-delete-my-data'): + self._intercept_command_stdout('dsmr_stats_clear_statistics') + + with mock.patch('dsmr_stats.services.clear_statistics') as service_mock: + self.assertFalse(service_mock.called) + self._intercept_command_stdout('dsmr_stats_clear_statistics', acked_warning=True) + self.assertTrue(service_mock.called) diff --git a/dsmr_stats/tests/test_services.py b/dsmr_stats/tests/test_services.py index 4b16cca8a..ab33ab010 100644 --- a/dsmr_stats/tests/test_services.py +++ b/dsmr_stats/tests/test_services.py @@ -160,6 +160,27 @@ def test_analyze_service_skip_current_day(self, now_mock): self.assertFalse(DayStatistics.objects.exists()) self.assertFalse(HourStatistics.objects.exists()) + def test_clear_statistics(self): + # Prepare some test data that should be deleted. + target_date = timezone.make_aware(timezone.datetime(2016, 1, 1, 12)) + statistics_dict = self._get_statistics_dict(target_date) + DayStatistics.objects.create(**statistics_dict) + + HourStatistics.objects.create( + hour_start=timezone.now(), + electricity1=1, + electricity2=0, + electricity1_returned=0, + electricity2_returned=0, + ) + self.assertTrue(DayStatistics.objects.exists()) + self.assertTrue(HourStatistics.objects.exists()) + + dsmr_stats.services.clear_statistics() + + self.assertFalse(DayStatistics.objects.exists()) + self.assertFalse(HourStatistics.objects.exists()) + @mock.patch('django.core.cache.cache.clear') @mock.patch('django.utils.timezone.now') def test_analyze_service_clear_cache(self, now_mock, clear_cache_mock): diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 7deb7236f..3eec12b79 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 9) +VERSION = (1, 2, 0, 'beta', 10) __version__ = get_version(VERSION) diff --git a/dsmrreader/locales/nl/LC_MESSAGES/django.mo b/dsmrreader/locales/nl/LC_MESSAGES/django.mo index e070e6ed3493846920407d0d18c7e11462cb272f..820c2e252c4c443dc545d3c7fdca11bc2af5f67a 100644 GIT binary patch delta 6351 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 delta 6002 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\n" "Language-Team: Dennis Siemensma \n" "Language: nl\n" @@ -21,18 +21,11 @@ msgstr "" msgid "Backend" msgstr "Achterkant" -msgid "" -"Unsupported database engine \"{}\" active, some features might not work " -"properly" -msgstr "" -"De database engine \"{}\" wordt niet actief ondersteund, sommige functies " -"werken hierdoor mogelijk minder goed" +msgid "Unsupported database engine \"{}\" active, some features might not work properly" +msgstr "De database engine \"{}\" wordt niet actief ondersteund, sommige functies werken hierdoor mogelijk minder goed" -msgid "" -"Generates a generic event triggering apps for backend operations, cron-like." -msgstr "" -"Genereert een generiek signaal dat gebruikt kan worden door plugins voor " -"achtergrondoperaties, zoals cron." +msgid "Generates a generic event triggering apps for backend operations, cron-like." +msgstr "Genereert een generiek signaal dat gebruikt kan worden door plugins voor achtergrondoperaties, zoals cron." msgid "Forces single run, overriding Infinite Command mixin" msgstr "Forceert enkele uitvoer." @@ -43,45 +36,26 @@ msgstr "Backup" msgid "Backup daily" msgstr "Dagelijkse backup" -msgid "" -"Create a backup of your data daily. Stored locally, but can be exported " -"using Dropbox." -msgstr "" -"Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan " -"geexporteerd worden via Dropbox." +msgid "Create a backup of your data daily. Stored locally, but can be exported using Dropbox." +msgstr "Maak een dagelijkse backup van je gegevens. Wordt lokaal opgeslagen maar kan geexporteerd worden via Dropbox." msgid "Compress" msgstr "Comprimeren" -msgid "" -"Create backups in compressed (gzip) format, saving a significant amount of " -"disk space." -msgstr "" -"Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke " -"hoeveelheid schijfruimte bespaard wordt." +msgid "Create backups in compressed (gzip) format, saving a significant amount of disk space." +msgstr "Maak backups in gecomprimeerd (gzip) formaat, waarmee een aanzienlijke hoeveelheid schijfruimte bespaard wordt." msgid "Backup timestamp" msgstr "Tijdstip van backup" -msgid "" -"Daily moment of creating the backup. You should prefer a nightly timestamp, " -"as it might freeze or lock the application shortly during backup creation." -msgstr "" -"Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de " -"nacht te pakken, gezien het maken van een backup de werking van de " -"applicatie kort kan onderbreken." +msgid "Daily moment of creating the backup. You should prefer a nightly timestamp, as it might freeze or lock the application shortly during backup creation." +msgstr "Voorkeurstijdstip van dagelijkse backup. Ons advies is om een moment in de nacht te pakken, gezien het maken van een backup de werking van de applicatie kort kan onderbreken." msgid "Latest backup" msgstr "Meest recente backup" -msgid "" -"Timestamp of latest backup created. Automatically updated by application. " -"Please note that the application will ignore the \"backup_time\" setting the " -"first time used." -msgstr "" -"Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. " -"N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer " -"genegeerd!" +msgid "Timestamp of latest backup created. Automatically updated by application. Please note that the application will ignore the \"backup_time\" setting the first time used." +msgstr "Moment van de laatst gemaakte backup. Applicatie houdt dit automatisch bij. N.B.: Het voorkeurstijdstip van de backup wordt (eenmalig) de eerste keer genegeerd!" msgid "Backup configuration" msgstr "Backupconfiguratie" @@ -89,32 +63,14 @@ msgstr "Backupconfiguratie" msgid "Dropbox access token" msgstr "Dropbox 'access token'" -msgid "" -"The access token for your Dropbox account. You should register an App for " -"your own Dropbox account (https://www.dropbox.com/developers/apps). Please " -"select \"Permission type\" named \"App folder\" to restrict unneeded access. " -"Backups will be synced to a dedicated folder in your account. After creating " -"your App you should be able to generate an \"Access token\" and enter it " -"here. For more information, see https://blogs.dropbox.com/developers/2014/05/" -"generate-an-access-token-for-your-own-account" -msgstr "" -"Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen " -"account een applicatie registeren (https://www.dropbox.com/developers/apps). " -"Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder" -"\" om de gedeelde toegang tot je account te beperken. Backups worden " -"hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox " -"een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" " -"genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox." -"com/developers/2014/05/generate-an-access-token-for-your-own-account" +msgid "The access token for your Dropbox account. You should register an App for your own Dropbox account (https://www.dropbox.com/developers/apps). Please select \"Permission type\" named \"App folder\" to restrict unneeded access. Backups will be synced to a dedicated folder in your account. After creating your App you should be able to generate an \"Access token\" and enter it here. For more information, see https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" +msgstr "Het 'access token' voor je Dropbox account. Hiervoor moet je onder je eigen account een applicatie registeren (https://www.dropbox.com/developers/apps). Zorg ervoor dat je bij \"Permission type\" kiest voor de optie \"App folder\" om de gedeelde toegang tot je account te beperken. Backups worden hierdoor in je account op een geïsoleerde locatie gezet. Zodra je in Dropbox een applicatie hebt toegevoegd, kun je een zogeheten \"Access token\" genereren en hier invullen. Zie voor meer informatie: https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account" msgid "Latest sync" msgstr "Meest recente synchronisatie" -msgid "" -"Timestamp of latest sync with Dropbox. Automatically updated by application." -msgstr "" -"Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit " -"automatisch bij." +msgid "Timestamp of latest sync with Dropbox. Automatically updated by application." +msgstr "Tijdstip van de laatste synchronisatie met Dropbox. Applicatie werkt dit automatisch bij." msgid "Dropbox configuration" msgstr "Dropbox-configuratie" @@ -123,26 +79,16 @@ msgid "Consumption" msgstr "Verbruik" msgid "Meter Reading electricity delivered to client (low tariff) in 0,001 kWh" -msgstr "" -"Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt " -"uur" +msgstr "Meterstand van verbruikte elektriciteit (laagtarief) in stappen van 1 Watt uur" msgid "Meter Reading electricity delivered by client (low tariff) in 0,001 kWh" -msgstr "" -"Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 " -"Watt uur" +msgstr "Meterstand van teruggeleverde elektriciteit (laagtarief) in stappen van 1 Watt uur" -msgid "" -"Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" -msgstr "" -"Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt " -"uur" +msgid "Meter Reading electricity delivered to client (normal tariff) in 0,001 kWh" +msgstr "Meterstand van verbruikte elektriciteit (piektarief) in stappen van 1 Watt uur" -msgid "" -"Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" -msgstr "" -"Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 " -"Watt uur" +msgid "Meter Reading electricity delivered by client (normal tariff) in 0,001 kWh" +msgstr "Meterstand van teruggeleverde elektriciteit (piektarief) in stappen van 1 Watt uur" msgid "Actual electricity power delivered (+P) in 1 Watt resolution" msgstr "Daadwerkelijk geleverde elektriciteit geleverd (-P) in 1 Watt stappen" @@ -172,8 +118,7 @@ msgid "Description" msgstr "Omschrijving" msgid "For your own reference, i.e. the name of your supplier" -msgstr "" -"Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" +msgstr "Voor je eigen referentie, bijvoorbeeld de naam van je energieleverancier" msgid "Electricity 1 price (low tariff)" msgstr "Prijs elektriciteit 1 (daltarief)" @@ -202,11 +147,8 @@ msgstr "Per minuut" msgid "Compactor grouping type" msgstr "Metingen groeperen" -msgid "" -"Electricity readings are read every 10 seconds. We can group those for you." -msgstr "" -"Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je " -"groeperen." +msgid "Electricity readings are read every 10 seconds. We can group those for you." +msgstr "Elektriciteitsmetingen vinden elke 10 seconden plaats. We kunnen ze voor je groeperen." msgid "Consumption configuration" msgstr "Verbruiksconfiguratie" @@ -217,18 +159,11 @@ msgstr "Datalogger" msgid "Performs an DSMR P1 telegram reading on the COM port." msgstr "Leest een DSMR P1 telegram uit van de COM-poort (meting)." -msgid "" -"Generates a FAKE reading. DO NOT USE in production! Used for integration " -"checks." -msgstr "" -"Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor " -"integratietests." +msgid "Generates a FAKE reading. DO NOT USE in production! Used for integration checks." +msgstr "Genereert een NEP-meting. NIET GEBRUIKEN IN PRODUCTIE! Wordt gebruikt voor integratietests." -msgid "" -"Required option to acknowledge you that you WILL mess up your data with this." -msgstr "" -"Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data " -"kan verprutsen." +msgid "Required option to acknowledge you that you WILL mess up your data with this." +msgstr "Verplichte parameter om te bevestigen dat je beseft dat je hiermee je data kan verprutsen." msgid "Include gas consumption" msgstr "Neem gasverbruik mee" @@ -236,11 +171,8 @@ msgstr "Neem gasverbruik mee" msgid "Include electricity returned (solar panels)" msgstr "neem teruglevering elektriciteit mee (zonnepanelen)" -msgid "" -"Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" -msgstr "" -"Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-" -"my-data" +msgid "Intended usage is NOT production! Force by using --ack-to-mess-up-my-data" +msgstr "Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-mess-up-my-data" msgid "Timestamp indicating when the reading was taken, according to the meter" msgstr "Moment waarop de meting is gedaan, volgens de meter." @@ -249,22 +181,13 @@ msgid "Last hourly reading timestamp" msgstr "Tijdstip van laatste meting" msgid "Whether this reading has been processed for merging into statistics" -msgstr "" -"Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" +msgstr "Geeft aan of deze meting al verwerkt is in het samenvoegen van statistieken" msgid "DSMR reading" msgstr "DSMR-meting" -msgid "" -"Tariff indicator electricity. The tariff indicator can be used to switch " -"tariff dependent loads e.g boilers. This is responsibility of the P1 user. " -"Note: Tariff code 1 is used for low tariff and tariff code 2 is used for " -"normal tariff." -msgstr "" -"Tariefindicatie. Dit kan gebruikt worden om te wisselen met " -"tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is " -"voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " -"daltarief en tariefcode 2 voor piektarief." +msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." +msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor piektarief." msgid "Number of power failures in any phases" msgstr "Aantal stroomstoringen in alle fases" @@ -276,23 +199,19 @@ msgid "Number of voltage sags/dips in phase L1" msgstr "Aantal spanningsdippen in fase L1" msgid "Number of voltage sags/dips in phase L2 (polyphase meters only)" -msgstr "" -"Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningsdippen in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage sags/dips in phase L3 (polyphase meters only)" -msgstr "" -"Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningsdippen in fase L3 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L1" msgstr "Aantal spanningspieken in fase L1" msgid "Number of voltage swells in phase L2 (polyphase meters only)" -msgstr "" -"Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningspieken in fase L2 (alleen voor meters met meerdere fasen)" msgid "Number of voltage swells in phase L3 (polyphase meters only)" -msgstr "" -"Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" +msgstr "Aantal spanningspieken in fase L3 (alleen voor meters met meerdere fasen)" msgid "DSMR Meter statistics" msgstr "Meterstatistieken" @@ -306,36 +225,20 @@ msgstr "DSMR-versie 2/3" msgid "Poll P1 port" msgstr "Peil P1 poort" -msgid "" -"Whether we should track the P1 port on your smartmeter. Almost every feature " -"inside this project requires this to be enabled. However, it might be " -"disabled temporarily due to technical reasons, such as data migrations." -msgstr "" -"Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke " -"functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan " -"desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, " -"zoals datamigraties (bij updates)." +msgid "Whether we should track the P1 port on your smartmeter. Almost every feature inside this project requires this to be enabled. However, it might be disabled temporarily due to technical reasons, such as data migrations." +msgstr "Geeft aan of we de P1-poort van je slimme meter uitlezen. Vrijwel elke functionaliteit binnen dit project vereist dat dit altijd aanstaat. Het kan desondanks zijn dat het tijdelijk uitgezet wordt, wegens technische redenen, zoals datamigraties (bij updates)." msgid "Track meter statistics" msgstr "Houd meterstatistieken bij" -msgid "" -"Whether we should track any extra statistics sent by the meter, such as the " -"number of power failures of voltage dips. Data is not required for core " -"features." -msgstr "" -"Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal " -"stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de " -"basisfunctionaliteit." +msgid "Whether we should track any extra statistics sent by the meter, such as the number of power failures of voltage dips. Data is not required for core features." +msgstr "Geeft aan of we extra meterstatistieken moeten bijhouden, zoals het aantal stroomstoringen of spanningsdippen. Deze gegevens zijn niet nodig voor de basisfunctionaliteit." msgid "DSMR version" msgstr "DSMR-versie" -msgid "" -"The DSMR version your meter supports. Version should be printed on meter." -msgstr "" -"De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op " -"de meter." +msgid "The DSMR version your meter supports. Version should be printed on meter." +msgstr "De DSMR-versie ondersteund door je meter. Versie staat meestal aangegeven op de meter." msgid "COM-port" msgstr "COM-poort" @@ -373,11 +276,8 @@ msgstr "Weergaveconfiguratie" msgid "Archive" msgstr "Archief" -msgid "" -"No data found. It can take up to one day before any data is visible here." -msgstr "" -"Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer " -"gegevens zichtbaar." +msgid "No data found. It can take up to one day before any data is visible here." +msgstr "Geen gegevens gevonden. Pas na (de eerste) dagwisseling zijn hier meer gegevens zichtbaar." msgid "Select level of detail displayed" msgstr "Selecteer detailniveau" @@ -463,12 +363,8 @@ msgstr "Bekijk repository op Github" msgid "Theme created by" msgstr "Thema gemaakt door" -msgid "" -"No data found. Please make sure the datalogger is up and running and the " -"backend process is running as well." -msgstr "" -"Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het " -"achtergrondproces." +msgid "No data found. Please make sure the datalogger is up and running and the backend process is running as well." +msgstr "Geen gegevens gevonden. Zorg ervoor dat de datalogger draait, samen met het achtergrondproces." msgid "Base selection" msgstr "Basisselectie" @@ -482,12 +378,8 @@ msgstr "Alle instellingen" msgid "Setting" msgstr "Instelling" -msgid "" -"This will simply alter the latest backup timestamp displayed above to a week " -"ago." -msgstr "" -"Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up " -"een week in het verleden wordt gezet." +msgid "This will simply alter the latest backup timestamp displayed above to a week ago." +msgstr "Dit zorgt er simpelweg voor dat het tijdstip van de meest recente back-up een week in het verleden wordt gezet." msgid "Schedule new backup now" msgstr "Plan per direct nieuwe back-up in" @@ -549,20 +441,14 @@ msgstr "Selecteer het soort gegevens dat je wil exporteren." msgid "Day totals" msgstr "Dagtotalen" -msgid "" -"Summary of each day. Contains electricity, gas and costs (if applicable)." -msgstr "" -"Samenvatting van elke dag. Bevat elektriciteit, gas en gemaakte kosten " -"(wanneer van toepassing)." +msgid "Summary of each day. Contains electricity, gas and costs (if applicable)." +msgstr "Samenvatting van elke dag. Bevat elektriciteit, gas en gemaakte kosten (wanneer van toepassing)." msgid "Hour totals" msgstr "Uurtotalen" -msgid "" -"Summary of each hour read. Contains electricity and gas (if applicable)." -msgstr "" -"Samenvatting van elk uur. Bevat elektriciteit en gas (wanneer van " -"toepassing)." +msgid "Summary of each hour read. Contains electricity and gas (if applicable)." +msgstr "Samenvatting van elk uur. Bevat elektriciteit en gas (wanneer van toepassing)." msgid "Select date range start" msgstr "Selecteer startdatum" @@ -586,9 +472,7 @@ msgid "Excel (.CSV)" msgstr "Excel (.CSV)" msgid "Exports the data in Comma Separated Format, which can be read by Excel." -msgstr "" -"Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door " -"Excel." +msgstr "Exporteert de gegevens in komma gescheiden formaat, die in te lezen is door Excel." msgid "Add note for this date" msgstr "Voeg notitie toe voor deze datum" @@ -620,33 +504,21 @@ msgstr "Gas" msgid "Meter statistics" msgstr "Meterstatistieken" -msgid "" -"Tracking meter statistics is disabled. Enable this feature in the datalogger " -"settings to view statistics." -msgstr "" -"Meterstatistieken worden niet bijgehouden. Schakel dit bij de " -"dataloggerinstellingen in om de statistieken weer te geven." +msgid "Tracking meter statistics is disabled. Enable this feature in the datalogger settings to view statistics." +msgstr "Meterstatistieken worden niet bijgehouden. Schakel dit bij de dataloggerinstellingen in om de statistieken weer te geven." -#| msgid "Meter statistics" msgid "Usage statistics" msgstr "Verbruiksstatistieken" msgid "Most common electricity consumption" msgstr "Veelvoorkomend elektriciteitsverbruik" -msgid "" -"Average calculated among the top five most common electricity consumption " -"read. This might also be the (minimum) constant electricity consumption in " -"your home." -msgstr "" -"Gemiddeld elektriciteitsverbruik berekend over de vijf meest voorkomende " -"waardes. Dit is vaak ook het (minimale) elektriciteitsverbruik van je woning." +msgid "Average calculated among the top five most common electricity consumption read. This might also be the (minimum) constant electricity consumption in your home." +msgstr "Gemiddeld elektriciteitsverbruik berekend over de vijf meest voorkomende waardes. Dit is vaak ook het (minimale) elektriciteitsverbruik van je woning." -#| msgid "Latest electricity consumption tracked" msgid "Lowest electricity consumption read" msgstr "Laagst gemeten elektriciteitsverbruik" -#| msgid "Latest electricity consumption tracked" msgid "Highest electricity consumption read" msgstr "Hoogst gemeten elektriciteitsverbruik" @@ -665,12 +537,8 @@ msgstr "Elektriciteit 2 (per kWh)" msgid "Gas (per m3)" msgstr "Gas (per m3)" -msgid "" -"No energy supplier prices found for today. Enable this feature in " -"consumption settings to view prices." -msgstr "" -"Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de " -"verbruiksinstellingen om de prijzen weer te geven." +msgid "No energy supplier prices found for today. Enable this feature in consumption settings to view prices." +msgstr "Geen energieprijzen voor vandaag gevonden. Schakel dit in bij de verbruiksinstellingen om de prijzen weer te geven." msgid "DSMR-reader" msgstr "DSMR-reader" @@ -690,12 +558,8 @@ msgstr "Metingen" msgid "Status regarding the latest data read from your meter." msgstr "Voortgang m.b.t. de meest recente gevens uit je meter." -msgid "" -"It has been a while since the latest meter reading. Your datalogger " -"process might hang or has been crashed." -msgstr "" -"De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het " -"datalogger proces of is deze gecrashed." +msgid "It has been a while since the latest meter reading. Your datalogger process might hang or has been crashed." +msgstr "De laatste uitlezing van je meter is een tijdje geleden. Mogelijk hangt het datalogger proces of is deze gecrashed." msgid "Latest reading" msgstr "Laatste meting" @@ -709,53 +573,32 @@ msgstr "Totaal aantal metingen" msgid "Background" msgstr "Achtergrond" -msgid "" -"Status regarding processing readings, making them visible in other pages and " -"graphs." -msgstr "" -"Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze " -"zichtbaar zijn in andere pagina's en grafieken." +msgid "Status regarding processing readings, making them visible in other pages and graphs." +msgstr "Voortgang met betrekking tot het verwerken van uitlezingen, waarna ze zichtbaar zijn in andere pagina's en grafieken." msgid "Unprocessed readings" msgstr "Onverwerkte metingen" -msgid "" -"There are too many unprocessed readings. Your backend process might hang or has been crashed." -msgstr "" -"Er zijn te veel onverwerkte metingen. Mogelijk hangt het " -"achtergrondproces of is deze gecrashed." +msgid "There are too many unprocessed readings. Your backend process might hang or has been crashed." +msgstr "Er zijn te veel onverwerkte metingen. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest electricity consumption tracked" msgstr "Meest recente elektriciteitsverbruik verwerkt" -msgid "" -"It has been a while since electricity consumption was tracked. Your " -"backend process might hang or has been crashed." -msgstr "" -"Het meest recente elektriciteitsverbruik is een tijdje geleden verwerkt. " -"Mogelijk hangt het achtergrondproces of is deze gecrashed." +msgid "It has been a while since electricity consumption was tracked. Your backend process might hang or has been crashed." +msgstr "Het meest recente elektriciteitsverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Latest gas consumption tracked" msgstr "Meest recente gasverbruik verwerkt" -msgid "" -"It has been a while since gas consumption was tracked. Your backend " -"process might hang or has been crashed." -msgstr "" -"Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt " -"het achtergrondproces of is deze gecrashed." +msgid "It has been a while since gas consumption was tracked. Your backend process might hang or has been crashed." +msgstr "Het meest recente gasverbruik is een tijdje geleden verwerkt. Mogelijk hangt het achtergrondproces of is deze gecrashed." msgid "Data availability" msgstr "Beschikbaarheid gegevens" -msgid "" -"Based on readings until this moment. Electricity usage should be always " -"available. Gas usage and electricity return depend on your home situation." -msgstr "" -"Gebaseerd op verwerkte metingen tot nu toe. Elektriciteitsverbruik zou " -"altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering " -"hangen af van je thuissituatie." +msgid "Based on readings until this moment. Electricity usage should be always available. Gas usage and electricity return depend on your home situation." +msgstr "Gebaseerd op verwerkte metingen tot nu toe. Elektriciteitsverbruik zou altijd beschikbaar moeten zijn. Gasverbruik en elektriciteitsteruglevering hangen af van je thuissituatie." msgid "Data type" msgstr "Soort gegevens" @@ -766,21 +609,12 @@ msgstr "Gemeten" msgid "Electricity return" msgstr "Elektriciteitsteruglevering" -msgid "" -"All data below is calculated among all consumption tracked until a day ago. " -"Untracked consumption and any usage of today is not taken into account." -msgstr "" -"Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en " -"met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin " -"niet meegenomen." +msgid "All data below is calculated among all consumption tracked until a day ago. Untracked consumption and any usage of today is not taken into account." +msgstr "Alle onderstaande gegevens zijn gebaseerd op al het gemeten verbruik tot en met gisteren. Ongemeten verbruik en het verbruik van vandaag worden hierin niet meegenomen." #, python-format -msgid "" -"Current data displayed averages %(hour_statistics_count)s hour(s), among " -"%(day_statistics_count)s day(s)." -msgstr "" -"Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, " -"verdeeld over %(day_statistics_count)s dag(en)." +msgid "Current data displayed averages %(hour_statistics_count)s hour(s), among %(day_statistics_count)s day(s)." +msgstr "Huidige gegevens betreffen gemiddelden over %(hour_statistics_count)s uren, verdeeld over %(day_statistics_count)s dag(en)." #, python-format msgid "Average hourly electricity consumed (in %%)" @@ -803,6 +637,15 @@ msgstr "Elektriciteitsverbruik piek- en daltarief (afgelopen maand)" msgid "Trend & statistics" msgstr "Trends & statistieken" +msgid "Clears all statistics generated. Use this to regenerate them after altering prices." +msgstr "Verwijdert alle (dag/uur)statistieken. Gebruik dit wanneer je de energieprijzen hebt aangepast." + +msgid "Required to acknowledge you that you WILL delete your statistics with this." +msgstr "Verplichte parameter om te bevestigen dat je beseft dat je hiermee (gegenereerde) data verwijdert." + +msgid "Intended usage is NOT production! Force by using --ack-to-delete-my-data" +msgstr "Bedoeld voor gebruik buiten productie. Forceer uitvoer met --ack-to-delete-my-data" + msgid "Note" msgstr "Notitie" @@ -992,24 +835,14 @@ msgstr "Temperatuur (in ℃)" msgid "Track weather" msgstr "Houd weergegevens bij" -msgid "" -"Whether we should track and log outside temperatures using an external " -"service. Current service integrated is Buienradar" -msgstr "" -"Geeft aan of we buitentemperaturen meten via een externe dienst, en ze " -"bijhouden. Huidig gebruikte dienst is Buienradar" +msgid "Whether we should track and log outside temperatures using an external service. Current service integrated is Buienradar" +msgstr "Geeft aan of we buitentemperaturen meten via een externe dienst, en ze bijhouden. Huidig gebruikte dienst is Buienradar" msgid "Buienradar weather station" msgstr "Buienradar weerstation" -msgid "" -"The weather station used to measure and log outside temperatures. Choose one " -"nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of " -"all locations." -msgstr "" -"Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te " -"slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www." -"buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." +msgid "The weather station used to measure and log outside temperatures. Choose one nearby. See http://www.buienradar.nl/weerkaarten/temperatuur for a map of all locations." +msgstr "Het weerstation dat gebruikt wordt om buitentemperaturen te meten en op te slaan. Kies een locatie zo dicht mogelijk bij huis. Zie http://www.buienradar.nl/weerkaarten/temperatuur voor een kaart van alle locaties." msgid "Weather configuration" msgstr "Weergegevensconfiguratie" @@ -1039,18 +872,10 @@ msgstr "Engels" #~ msgstr "Bezig met bijwerken/uitrollen van DSMR-reader" #~ msgid "Please note that this may take a while, depending on your device..." -#~ msgstr "" -#~ "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je " -#~ "apparaat..." - -#~ msgid "" -#~ "Info regarding the version of this application. Automatic updates are not " -#~ "available (mostly due to privacy reasons), but you should be able to " -#~ "update manually." -#~ msgstr "" -#~ "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk " -#~ "wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een " -#~ "nieuwere versie." +#~ msgstr "Dit kan enige tijd in beslag nemen, afhankelijk van de snelheid van je apparaat..." + +#~ msgid "Info regarding the version of this application. Automatic updates are not available (mostly due to privacy reasons), but you should be able to update manually." +#~ msgstr "Versie-informatie. Automatische updates zijn niet mogelijk, voornamelijk wegens privacy-overwegingen, maar je kun wel handmatig bijwerken naar een nieuwere versie." #~ msgid "Updates" #~ msgstr "Updates" @@ -1077,8 +902,7 @@ msgstr "Engels" #~ msgstr "Weken in recente historie" #~ msgid "The number of weeks displayed in the recent history overview." -#~ msgstr "" -#~ "Het aantal weken dat getoond wordt in het recente historie overzicht." +#~ msgstr "Het aantal weken dat getoond wordt in het recente historie overzicht." #~ msgid "History" #~ msgstr "Geschiedenis" @@ -1104,12 +928,8 @@ msgstr "Engels" #~ msgid "(in °C)" #~ msgstr "(in °C)" -#~ msgid "" -#~ "Weather tracking is currently disabled. Enable this feature in weather " -#~ "settings to view temperatures (read hourly)." -#~ msgstr "" -#~ "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij " -#~ "weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." +#~ msgid "Weather tracking is currently disabled. Enable this feature in weather settings to view temperatures (read hourly)." +#~ msgstr "Weergegevens worden momenteel niet bijgehouden. Schakel dit bij weerinstellingen in om temperatuurmetingen te weergeven (uurlijks)." #~ msgid "Electricity 1 cost (low tariff)" #~ msgstr "Elektriciteit 1 kosten (daltarief)" @@ -1123,20 +943,11 @@ msgstr "Engels" #~ msgid "Theme by" #~ msgstr "Thema door" -#~ msgid "" -#~ "Number of times data read from your meter. Should be updated every 15 " -#~ "seconds." -#~ msgstr "" -#~ "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden " -#~ "uitgevoerd moeten worden." - -#~ msgid "" -#~ "Most data is processed with a small delay, but should take no longer than " -#~ "a minute to update. Gas consumption however, is only updated once a hour." -#~ msgstr "" -#~ "De meeste gegevens worden op de achtergrond verwerkt met een kleine " -#~ "vertraging. Echter zou het verwerken daarvan niet langer dan een minuut " -#~ "moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." +#~ msgid "Number of times data read from your meter. Should be updated every 15 seconds." +#~ msgstr "Aantal keer dat data uit je meter is uitgelezen. Zou elke 15 seconden uitgevoerd moeten worden." + +#~ msgid "Most data is processed with a small delay, but should take no longer than a minute to update. Gas consumption however, is only updated once a hour." +#~ msgstr "De meeste gegevens worden op de achtergrond verwerkt met een kleine vertraging. Echter zou het verwerken daarvan niet langer dan een minuut moeten duren. Uitgezonderd gasverbruik, wat elk uur verwerkt wordt." #~ msgid "Based on readings until this moment" #~ msgstr "Gebaseerd op metingen tot nu toe" @@ -1148,14 +959,10 @@ msgstr "Engels" #~ msgstr "Gemiddeld verbruik elektriciteit 2 (piektarief) per daguur in kWh" #~ msgid "Average hourly electricity 1 return (low tariff) yield in kWh" -#~ msgstr "" -#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) " -#~ "per daguur in kWh" +#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 1 (daltarief) per daguur in kWh" #~ msgid "Average hourly electricity 2 return (high tariff) yield in kWh" -#~ msgstr "" -#~ "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 " -#~ "(piektarief) per daguur in kWh" +#~ msgstr "Verhouding gemiddelde opbrengst/teruglevering elektriciteit 2 (piektarief) per daguur in kWh" #~ msgid "Average hourly electricity demand in Watt" #~ msgstr "Gemiddelde elektriciteitsvraag per daguur in Watt" @@ -1170,8 +977,7 @@ msgstr "Engels" #~ msgstr "Dagelijks elektriciteitsverbruik in de afgelopen %(days_ago)s dagen" #~ msgid "Daily electricity returned in the past %(days_ago)s days" -#~ msgstr "" -#~ "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" +#~ msgstr "Dagelijks elektriciteitsteruglevering in de afgelopen %(days_ago)s dagen" #~ msgid "Daily gas usage in the past %(days_ago)s days" #~ msgstr "Dagelijks gasverbruik in de afgelopen %(days_ago)s dagen" @@ -1206,67 +1012,38 @@ msgstr "Engels" #~ msgid "Compacts existing DSMR readings into consumption points." #~ msgstr "Voegt bestaande DSMR uitlezingen samen in verbruiksgegevens." -#~ msgid "" -#~ "The max number of readings to compact this run (default: %(default)s)" -#~ msgstr "" -#~ "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt " -#~ "(standaard: %(default)s)" +#~ msgid "The max number of readings to compact this run (default: %(default)s)" +#~ msgstr "Het maximum aantal uitlezingen dat per keer gegroepeerd wordt (standaard: %(default)s)" #~ msgid "DEPRECATED: Moved to settings in database." #~ msgstr "UITGEFASEERD: Instellingen zijn verplaatst naar de database." -#~ msgid "" -#~ "Purges all consumption data (DELETES IT!) and marks all readings as " -#~ "unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL " -#~ "HISTORIC READINGS!" -#~ msgstr "" -#~ "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle " -#~ "uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van " -#~ "groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" - -#~ msgid "" -#~ "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please " -#~ "use dsmr_backend" -#~ msgstr "" -#~ "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik " -#~ "alsjeblieft dsmr_backend" +#~ msgid "Purges all consumption data (DELETES IT!) and marks all readings as unprocessed.Only use this when changing compact grouping AND YOU HAVE ALL HISTORIC READINGS!" +#~ msgstr "Wist alle verbruiksgegevens (VERWIJDERT HET!) en markeert alle uitlezingen als onverwerkt. Gebruik dit alleen als je wisselt van groeperingsnauwkeurigheid EN JE ALLE DSMR-METINGEN NOG HEBT!" + +#~ msgid "dsmr_stats_compactor is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_backend" +#~ msgstr "dsmr_stats_compactor wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_backend" #~ msgid "Polls the serial port for DSMR telegram and performs a reading." #~ msgstr "Controleert de seriele poort voor DSMR-gegevens en leest deze uit." #~ msgid "COM-port connected to Smartmeter (default: %(default)s)" -#~ msgstr "" -#~ "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" - -#~ msgid "" -#~ "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please " -#~ "use dsmr_datalogger" -#~ msgstr "" -#~ "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik " -#~ "alsjeblieft dsmr_datalogger" - -#~ msgid "" -#~ "Your current trends and statistics settings do not allow to track trends! " -#~ "You should enable it to have accurate (or any) data below." -#~ msgstr "" -#~ "Je huidige trends- en statistiekeninstellingen staan niet toe om trends " -#~ "bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder " -#~ "te zien." - -#~ msgid "" -#~ "Trends might be recalculated retroactively, depending on whether all " -#~ "historic DSMR source readings are still available." -#~ msgstr "" -#~ "Trends kunnen met terugwerkende kracht berekend worden, mits alle " -#~ "historische DSMR-uitlezingen nog beschikbaar zijn." +#~ msgstr "COM-poort die verbonden is met je slimme meter (standaard: %(default)s)" + +#~ msgid "dsmr_stats_datalogger is DEPRECATED, and will be REMOVED in v1.0, please use dsmr_datalogger" +#~ msgstr "dsmr_stats_datalogger wordt UITGEFASEERD in versie 1.0, gebruik alsjeblieft dsmr_datalogger" + +#~ msgid "Your current trends and statistics settings do not allow to track trends! You should enable it to have accurate (or any) data below." +#~ msgstr "Je huidige trends- en statistiekeninstellingen staan niet toe om trends bij te houden. Pas dit aan om accurate (of uberhaupt) gegevens hieronder te zien." + +#~ msgid "Trends might be recalculated retroactively, depending on whether all historic DSMR source readings are still available." +#~ msgstr "Trends kunnen met terugwerkende kracht berekend worden, mits alle historische DSMR-uitlezingen nog beschikbaar zijn." #~ msgid "Track trends" #~ msgstr "Houd trends bij" -#~ msgid "" -#~ "Whether we should track trends by storing daily consumption summaries." -#~ msgstr "" -#~ "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." +#~ msgid "Whether we should track trends by storing daily consumption summaries." +#~ msgstr "Geeft aan of we trends over het dagelijkse verbruik bijhouden en opslaan." #~ msgid "Trends & statistics configuration" #~ msgstr "Trends- & statistiekenconfiguratie" @@ -1274,21 +1051,14 @@ msgstr "Engels" #~ msgid "Value" #~ msgstr "Waarde" -#~ msgid "" -#~ "This page displays all settings and the status of them. You can change " -#~ "them here" -#~ msgstr "" -#~ "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je " -#~ "kunt ze hier veranderen" +#~ msgid "This page displays all settings and the status of them. You can change them here" +#~ msgstr "Deze pagina geeft een overzicht van alle instellingen en hun waarde. Je kunt ze hier veranderen" #~ msgid "BAUD rate" #~ msgstr "BAUD-waarde" -#~ msgid "" -#~ "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" -#~ msgstr "" -#~ "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 " -#~ "voor oudere versies" +#~ msgid "BAUD rate used for Smartmeter. 115200 for DSMR v4, 9600 for older versions" +#~ msgstr "BAUD-waarde gebruikt door slimme meter. 115200 voor DSMR versie 4, 9600 voor oudere versies" #~ msgid "GRAPH_SHORT_DATETIME l, P" #~ msgstr "GRAPH_SHORT_DATETIME l G:i" @@ -1302,16 +1072,8 @@ msgstr "Engels" #~ msgid "Miscellaneous statistics" #~ msgstr "Overige statistieken" -#~ msgid "" -#~ "Tariff indicator electricity. The tariff indicator can be used to switch " -#~ "tariff dependent loads e.g boilers. This is responsibility of the P1 " -#~ "user. Note: Tariff code 1 is used for low tariff and tariff code 2 is " -#~ "used for normal tariff." -#~ msgstr "" -#~ "Tariefindicatie. Dit kan gebruikt worden om te wisselen met " -#~ "tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording " -#~ "is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor " -#~ "daltarief en tariefcode 2 voor hoogtarief." +#~ msgid "Tariff indicator electricity. The tariff indicator can be used to switch tariff dependent loads e.g boilers. This is responsibility of the P1 user. Note: Tariff code 1 is used for low tariff and tariff code 2 is used for normal tariff." +#~ msgstr "Tariefindicatie. Dit kan gebruikt worden om te wisselen met tariefafhankelijke vraag, zoals bijvoorbeeld een boiler. Verantwoording is voor de gebruiker van de P1-poort. N.B.: Tariefcode 1 is gebruikt voor daltarief en tariefcode 2 voor hoogtarief." #~ msgid "Electricity 2" #~ msgstr "Elektriciteit 2" From 654fa090683723e9bc430bef1b3ec69a17a7f92d Mon Sep 17 00:00:00 2001 From: Dennis Siemensma Date: Wed, 18 May 2016 21:16:25 +0200 Subject: [PATCH 13/13] Allow day & hour statistics reset due to changing energy prices #95 --- docs/changelog.rst | 4 ++-- dsmrreader/__init__.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index a34df0c3e..70e8e277c 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,7 +2,7 @@ Changelog ========= -v1.2.0 - 2016-xx-xx +v1.2.0 - 2016-05-20 ^^^^^^^^^^^^^^^^^^^ - Energy supplier prices does not indicate tariff type (Django admin) (`#126 `_). - Requirements update (`#128 `_). @@ -13,7 +13,7 @@ v1.2.0 - 2016-xx-xx - Pie charts on trends page overlap their canvas (`#136 `_). - 'Slumber' consumption (`#115 `_). - Show lowest & highest Watt peaks (`#138 `_). -- Reset day & hour statistics when changing energy prices (`#95 `_). +- Allow day & hour statistics reset due to changing energy prices (`#95 `_). v1.1.2 - 2016-05-01 diff --git a/dsmrreader/__init__.py b/dsmrreader/__init__.py index 3eec12b79..2d76db6a5 100644 --- a/dsmrreader/__init__.py +++ b/dsmrreader/__init__.py @@ -17,6 +17,6 @@ from django.utils.version import get_version -VERSION = (1, 2, 0, 'beta', 10) +VERSION = (1, 2, 0, 'final', 0) __version__ = get_version(VERSION)