EnerZIE: energieverbruik bijhouden in een Google Spreadsheet

Door nickyb2 op maandag 29 mei 2017 09:00 - Reacties (15)
Categorie: energie, Views: 2.657

Hoewel ik normaal gesproken alles probeer te automatiseren als het te automatiseren is, gebruik ik een niet automatische variant voor het bijhouden van mijn energieverbruik 8)7. Raar? Misschien.. In maart 2014 heb ik een nieuwe elektriciteit en gas meter gekregen, variant 'slim'. Uiteraard van alles er aan gehangen zoals mindergas, enelogic en energiemanageronline, echter kon geen één mij overtuigen het te blijven gebruiken.

Dus.. zelf maar iets ontwikkelen dan. Omdat ik geen 'gegevens' wilde kwijt raken, schreef (typ) ik braaf elke eerste van de maand mijn meterstanden in een Google Spreadsheet. Het idee was 'veilig stellen'.
Vervolgens was het een haat-liefde verhouding met iets zelf ontwikkelen. Wat ik ook ontwikkelde om mijn meterstanden automatisch uit te lezen en inzicht te tonen, bood het weinig extra t.o.v. de spreadsheet die ik steeds uitbreidde. Zelfs toen de zonnepanelen op het dak kwamen, had het mijn voorkeur om de spreadsheet uit te breiden.

Het hele idee, zelf iets ontwikkelen, heb ik laten varen, misschien dat ik het ooit nog eens oppak maar voorlopig niet. De spreadsheet bied mij het inzicht wat ik nodig heb en dat is voldoende voor nu. Kan het beter? Zeer zeker, dus tijd om het te delen en ervaring en meningen te verzamelen van anderen.

De spreadsheet geeft je inzicht in de volgende twee zaken:
  • een indicatie van je verbruik voor een jaar van zowel elektriciteit als gas
  • een indicatie van je energiekosten per maand, in verhouding met het voorschot wat je betaald
Je krijgt, tenzij je elke dag je meterstanden invult, geen inzicht in hoeveel je elke dag verbruikt. Ik vind dat zelf namelijk totaal niet belangrijk. De ene dag staat bij mij de wasmachine, droger en vaatwasser aan, de andere dag weer niet. De hoeveelheid elektriciteit die ik per dag verbruik veranderd te veel waardoor het voor mij niet interessant is.

De spreadsheet is vrij eenvoudig, slechts twee tabbladen, één voor je meterstanden en de berekeningen en één voor je tarieven. Na het invullen van je meterstanden en een tarief wordt er een 'gemiddelde' berekend van de afgelopen 3 jaar om een indicatie te geven van het aantal kWh en m3 dat verbruikt/opgewekt wordt per jaar. Combineer deze indicatie met het tarief en je weet hoeveel je ongeveer terug krijgt of bij moet lappen aan de energietent. Naar mate je meer meterstanden hebt, het liefst van de afgelopen 3 jaar, hoe beter de indicatie is.
https://tweakers.net/ext/f/62A6PEaZceRgTv5pwrU2EkEU/medium.png
Je mag zelf kiezen hoe vaak je je meterstanden invult, zelf vul ik ze één maal per maand in. Soms ook wel eens vaker, soms vergeet ik het ook wel eens. Voor de spreadsheet maakt het niet zo heel veel uit, behalve dat de seizoensinvloeden hierdoor hoger kunnen zijn. Bij het berekenen van één jaar geleden gaat hij op zoek naar een ingevulde meterstand van één jaar geleden of de 'vorige' als hij de die datum niet vindt. Dit kan betekenen dat je, als je je meterstanden sporadisch invult je een paar maanden meer in de berekening krijgt. Het meest handig is om je meterstanden eens per week, maand of per twee maanden in te vullen.

Als je je tarieven hebt ingevuld kun je één van de tarieven selecteren via de dropdown. Vervolgens worden de kosten berekend aan de hand van het gekozen tarief.

De spreadsheet kun je hier vinden. Om een beeld te geven hoe het er na 3 jaar uitziet heb ik er een hoop gegevens in gezet. Maak een kopie en schoon de boel op en vul je eigen meterstanden/tarieven in.

Veel plezier ermee. Alle tips, ideeën, bugs zijn welkom.

Home Assistant: Philips Hue Motion Sensor

Door nickyb2 op woensdag 26 oktober 2016 06:41 - Reacties (20)
Categorieën: home assistant, philips hue, Views: 7.891

Nog niet zo heel lang geleden heeft Philips een Motion Sensor uitgebracht voor de Hue lijn. Ik heb wel even getwijfeld of ik deze motion sensor wilde hebben, ik was immers best tevreden met mijn huidige Aeon Labs Multi sensoren. Echter de combinatie van AAA batterijen en de mogelijkheid ze overal op te hangen heeft mij toch doen besluiten om er twee (nummer drie is in bestelling) aan te schaffen.

Ik heb van een aantal mede-tweakers de vraag gekregen hoe ik ze gekoppeld heb in Home Assistant, mijn domotica oplossing. Dus tijd voor een korte post over hoe ik, mijn manier, ze binnen Home Assistant beschikbaar maak om ze te kunnen gebruiken.

Het doel van deze blog post is dat je aan het eind voor elke Hue Motion Sensor het volgende hebt:
  • Binary Sensor - Beweging on/off
  • Sensor - Lichtsterkte in Lux
  • Sensor - Temperatuur (de Hue Motion Sensor meet ook temperatuur)
om bovenstaand te bereiken heb je het volgende nodig:
  • Home Assistant - :X
  • API-key/User van de Bridge - zie hier (Het Hue systeem is heel wat meer dan enkel wat je met de default Philips App kunt, meld je aan, lees de documentatie)
  • Web Browser - om de CLIP API Debugger aan te spreken
Hoe je je Motion Sensor aan de bridge koppelt kun je in je handleiding vinden en ga dat ook vooral doen want anders kun je niet verder.


Lichtsterkte sensor en temperatuur sensor
Het toevoegen van de lichtsterkte en temperatuur sensor is erg eenvoudig Beide zijn beschikbaar door de Bridge uit te vragen via een REST call en laat Home Assistant nu een REST sensor hebben.

Ga naar de CLIP API debugger (http://<JOUW BRIDGE IP>/debug/clip.html) met je webbrowser en voer een GET uit op de volgende URL: /api/<API-key>/sensors
Dit geeft je een lijst met al je sensoren, ga nu op zoek naar de lichtsterkte sensor (type ZLLLightLevel) en de temperatuur sensor (type ZLLTemperature) en noteer het sensor nummer.

Je kunt nu in Home Assistant twee sensoren maken als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
- platform: rest
  resource: http://[bridge IP]/api/[API-key]/sensors/[sensor id]
  value_template: '{{ value_json.state.lightlevel }}'
  unit_of_measurement: Lux
  name: 'Woonkamer'
  
- platform: rest
  resource: http://[bridge IP]/api/[API-key]/sensors/[sensor id]
  value_template: '{{ value_json.state.temperature | float / 100 }}'
  unit_of_measurement: °C
  name: 'Woonkamer'


Vul uiteraard je bridge IP, API-key en gevonden sensor id's in op de juiste plekken. Als het goed is zou Home Assistant je nu de twee sensoren moeten tonen.


Bewegings Sensor
Je kunt de bewegingssensor op dezelfde manier te ontsluiten als de lichsterkte en temperatuur sensor, echter zou ik je willen adviseren even door te lezen voor een andere oplossing. Waarom?

Als de sensor beweging detecteert wordt presence=true aan de bridge gemeld en kun je dit uitlezen door de bridge te raadplegen. Tot zover niet anders dan de andere sensoren. Na +/- 30 seconden meld de sensor bij de bridge een presence=false, omdat je bijvoorbeeld even buiten bereik bent of te stil zit. In principe is dit precies de werking van hoe we een beweging sensor willen hebben, maar...

De bewegings sensor meld het bij de bridge en niet bij Home Assistant, dit betekent dat Home Assistant actief moet 'pollen' om de juiste status te kunnen tonen en gebruiken in eventuele automation regels. Ik meen dat de standaard (scan_interval) tijd van Home Assistant op 30 seconden staat en hoewel je dit kan aanpassen door vaker te pollen hoeft dat niet. Het risico wat je loopt is dat je een 'presence' melding mist, omdat Home Assistant niet op de juiste tijd gekeken heeft. Dit veroorzaakt een vertraging in je domotica oplossing en hoewel dat niet altijd even erg is kan je er ook last van hebben.

Als ik dit vergelijk met mijn ZWave motion sensors (standaard tijd is 4 minuten) is de tijd instelbaar en zou ik dat graag ook willen in de Hue Motion Sensors. Naar mijn weten is dit (op dit moment) niet instelbaar, maar omdat de Bridge ook een Rule Engine heeft kunnen we het in de Bridge inbouwen.

Wat we gaan doen is een 'virtuele bewegingssensor' toevoegen die actief gezet wordt door de fysieke bewegingssensor, na een instelbare tijd van X aantal minuten (ik ga voor 5 minuten) geen beweging wordt de status van de virtuele gereset naar geen beweging. Door deze virtuele bewegingssensor in Home Assistant te ontsluiten hebben we een stabiele sensor die prima te gebruiken is in automation regels.

De werkzaamheden hieronder dienen allemaal uitgevoerd te worden in de CLIP API Debugger.


Toevoegen virtuele bewegingssensor
Voer een POST uit op de volgende URL /api/[API -key]/sensors met onderstaande body om de virtuele bewegingssensor aan te maken. Je kunt de namen aanpassen aan wat je wilt.

code:
1
2
3
4
5
6
7
8
9
{   
    "name": "Wnk.Presence",
    "type": "CLIPGenericStatus",
    "modelid": "PHA_STATE",
    "manufacturername": "Philips",
    "swversion": "1.0",
    "uniqueid": "Wnk.Presence",
    "recycle": false
}



Als resultaat krijg je het sensor id terug van de virtuele bewegingssensor.


Verbinden fysieke aan virtuele bewegingssensor
Mijn fysieke bewegingssensor heeft ID: 8
Mijn virtuele bewegingssensor heeft ID: 17

Voer een POST uit op de volgende URL /api/[API-key]/rules met onderstaande body voor het toevoegen van een regel in de bridge die beide sensoren verbindt. Vervang de drie sensor ID's door die van jou.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
    "name": "Wnk.Presence",
    "conditions": [
        {
            "address": "/sensors/8/state/presence",
            "operator": "eq",
            "value": "true"
        },
        {
            "address": "/sensors/8/state/presence",
            "operator": "dx"
        }
    ],
    "actions": [
        {
            "address": "/sensors/17/state",
            "method": "PUT",
            "body": {
                "status": 1
            }
        }
    ]
}




Resetten virtuele bewegingssensor
Mijn fysieke bewegingssensor heeft ID: 8
Mijn virtuele bewegingssensor heeft ID: 17

Voer een POST uit op de volgende URL /api/[API-key]/rules met onderstaande body om een regel toe te voegen die de virtuele bewegingssensor reset na 5 minuten geen beweging. Vervang wederom de drie sensor ID's door die van jou.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
    "name": "Wnk.Presence.Reset",
    "conditions": [
        {
            "address": "/sensors/8/state/presence",
            "operator": "eq",
            "value": "false"
        },
        {
            "address": "/sensors/8/state/presence",
            "operator": "ddx",
            "value": "PT00:05:00"
        }
    ],
    "actions": [
        {
            "address": "/sensors/17/state",
            "method": "PUT",
            "body": {
                "status": 0
            }
        }
    ]
}



Als het goed is, zal de virtuele bewegingssensor nu mee aan schakelen als je fysieke bewegingssensor schakelt en uit schakelen als je fysieke bewegingssensor vijf minuten geen beweging detecteert.


Koppeling virtuele bewegingssensor met Home Assistant
Als laatste voegen we een Binary Sensor toe aan Home Assistant met als sensor ID het ID van de virtuele bewegingssensor.

code:
1
2
3
4
- platform: rest
  resource: http://[bridge IP]/api/[API-key]/sensors/[sensor id]
  value_template: '{{ value_json.state.status }}'
  name: 'Woonkamer'



Ben bovenstaande oplossing automatiseer ik een aantal zaken, zoals het aan/uit doen van de keukenboiler. Aan op beweging, uit na 15 minuten geen beweging. Daarnaast de 'niet hue' lampen die ik nog heb worden geschakeld op basis van beweging en lichtsterkte, etc, etc.

Ik hoop dat jullie er wat aan hebben en ik zie de verbeteringen graag tegemoet.

bijmij-grafana: OpenTherm Gateway

Door nickyb2 op zaterdag 30 april 2016 14:51 - Reacties (14)
Categorieën: grafana, influxdb, otgw, Views: 8.361

Een korte tijd geleden ben ik begonnen met een project dat ik 'bijmij' gedoopt heb. Bijmij is een verzameling ideeën, scripts, blogs en aanverwante zaken over hoe ik 'bijmij' monitoring doe, hoe mijn domotica werkt of hoe ik bijvoorbeeld mijn CV ketel in de gaten hou.

Deze post gaat over hoe we met een OpenTherm Gateway en wat software het volgende Dashboard kunnen maken.
bijmij-grafana-otgw


Het dashboard geeft je een redelijk inzicht in hoe je CV ketel zijn werk aan het doen is en is onderverdeeld in vier blokken:
  • De huidige en gewenste temperatuur zoals door je thermostaat wordt gemeten.
  • De aanvoer en retour temperatuur van en naar de CV ketel toe en tonen we de maximum retour van 55 graden.
  • Het modulatie niveau van je CV ketel
  • Welke modus aanstaan, Vlam, CV-modus of Warm Water Modus
Het dashboard is gemaakt in Grafana, een software pakket waarmee je aan de hand van tijdseries data dashboards en grafieken kunt maken. De tijdseries data zit opgeslagen in een InfluxDB.

Wat heb je allemaal nodig:
Om van CV ketel tot aan het dashboard te komen hebben we een aantal onderdelen nodig:Hieronder een schema van waar welk onderdeel zich bevindt.

bijmij-grafana-otgw-components


Er zijn meerdere manieren om de OTGW uit te lezen. Ik heb gekozen om dit via de otmonitor software te doen en wel om de volgende redenen:
  • otmonitor biedt een json api waarin alle laatst gemeten waarden in staan. Dit wordt gebruikt voor het periodiek (elke x aantal seconden) uitlezen van alle meetwaarden
  • otmonitor biedt een WebSocket waarin alle wijzigingen op doorkomen. Dit wordt gebruikt om bij bepaalde wijzigingen, zoals warm water open/dicht een meting op te slaan in de InfluxDB. Doen we dit niet, dan kunnen we interessante metingen missen. Stel de warm water kraan gaat open en dicht binnen de periodieke uitlezing, dan missen we die waardes en dan zien we dat niet terug in het Dashboard
  • los van het uitlezen van meetwaarden wil ik ook mijn setpoint kunnen beïnvloeden via een domotica oplossing, otmonitor ondersteund dit via de command pagina

Voorbereidingen:
Ik zal nu uitleggen hoe ik de installatie bij mij gedaan heb en het is aan jou om dit aan te passen aan jou gekozen platform en naam keuzes.

Als eerste zul je Grafana en InfluxDB moeten installeren en de websites van zowel Grafana als InfluxDB bieden voldoende houvast om dit te doen en zal ik hier niet nogmaals gaan herhalen. Kies voor Grafana voor versie 3 (nu nog beta).

Zowel Grafana als InfluxDB draaien bij mij in dezelfde VM op Ubuntu 16.04 LTS. Als je beide geïnstalleerd hebt zal je een database moeten aanmaken op de InfluxDB en ik raad je aan om een retention policy aan te maken.

Je kunt de CLI van InfluxDB opstarten doormiddel van:

code:
1
$ influx


Ik heb gekozen om mijn database 'bijmij' te noemen.

code:
1
influx$ CREATE DATABASE bijmij;


Een retention policy zorgt ervoor dat je niet oneindig data in je database gaat pompen. Mijn retention policy houdt maximaal 30 dagen vast, daarna worden de oudste records automatisch verwijderd. De retention policy noem ik 'raw' als hierin zit de ruwe data en moeten we misschien nog wat mee doen. Langer dan 30 dagen wil ik het in ieder geval niet bewaren.

code:
1
influx$ CREATE RETENTION POLICY raw ON bijmij DURATION 30d REPLICATION 1;


Vervolgens kun je in Grafana een InfluxDB koppelen via een DataSource:

http://static.tweakers.net/ext/f/9DPWRM7yHvCUWuTYKyiDGT1U/full.png



De OTGW hangt via USB aan een Raspberry PI Model 2 welke ook de otmonitor software draait. De otmonitor moet in daemon mode gezet worden en beschikbaar zijn via http.

Ik gebruik supervisor om de otmonitor op de juiste manier te starten. Je kunt onderstaand supervisor config gebruiken, uiteraard zul je de paden en dergelijk moeten aanpassen aan jou eigen situatie.

code:
1
2
3
4
5
6
7
[program:otmonitor-ahf]
command = <PATH TO OTMONITOR>/otmonitor-ahf --daemon -w 8080 /dev/ttyUSB0
user = pi
autostart = true
autorestart = true
stdout_logfile = NONE
stderr_logfile = NONE



Uitlezen OTGW -> InfluxDB:
De volgende stap is het uitlezen van de OTGW en de meetgevens plaatsen in de InfluxDB. Ik heb hiervoor een script geschreven in Python en gebruik ook een aantal dependencies. Laten we eerst de dependencies gaan installeren via pip:

code:
1
2
3
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo -H pip install "influxdb>=2.12.0" "requests>=2.9.1" "websocket-client>=0.37.0"



Vervolgens kunnen we het script gaan downloaden en aanroepen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
usage: bijmij-otmonitor-influxdb.py [-h] [--hostname hostname] [-p port]
                                    [-s secs] [--rml-min min] [--rml-max max]
                                    [--influx-hostname hostname]
                                    [--influx-port port]
                                    [--influx-username username]
                                    [--influx-password password]
                                    [--influx-database dbname]
                                    [--influx-retention-policy policy]
                                    [--influx-measurement measurement]
                                    [-v | -q]
                                    [tag ...]

Send otmonitor updates to an InfluxDB API

optional arguments:
  -h, --help            show this help message and exit
  --hostname hostname   hostname to connect to otmonitor, defaults to
                        'localhost'
  -p port, --port port  port to connect to otmonitor, defaults to 8080
  -s secs, --sleep secs
                        number of seconds to sleep between updates, defaults
                        to 60
  --rml-min min         minimum modulation, defaults to 30
  --rml-max max         maximum modulation, defaults to 100
  -v, --verbose         Be verbose
  -q, --quiet           Be very quiet

  --influx-hostname hostname
                        hostname to connect to InfluxDB, defaults to
                        'localhost'
  --influx-port port    port to connect to InfluxDB, defaults to 8086
  --influx-username username
                        user to connect, defaults to 'root'
  --influx-password password
                        password of the user, defaults to 'root'
  --influx-database dbname
                        database name to connect to, defaults to 'bijmij'
  --influx-retention-policy policy
                        retention policy to use
  --influx-measurement measurement
                        measurement name to store points, defaults to
                        otmonitor
  tag ...               any tag to the measurement


Het ziet er ingewikkelder uit dan het is. De gekozen default zijn vrijwel altijd de juiste maar er is voldoende flexibiliteit om aan te passen aan jouw eigen situatie. Waar je goed op moet letten is welke retention policy je neemt, je wilt hier waarschijnlijk net als ik de 'raw' nemen en als je hem niet invult komt hij standaard op default te staan. Dit script start ik weer met supervisor en dan kun je gelijk mijn eigen aanroep zien:

code:
1
2
3
4
5
6
7
8
9
10
[program:bijmij-otmonitor-influxdb]
command = python <PATH TO>bijmij-otmonitor-influxdb.py -q --hostname <otmonitor IP> -s 15 --influx-retention-policy raw
user = bijmij
autostart = true
autorestart = true

redirect_stderr = true
stdout_logfile = /var/log/bijmij/bijmij-otmonitor-influxdb.log
stdout_logfile_maxbytes = 1MB
stdout_logfile_backups = 3



Bovenstaand schrijft mijn OTGW gegevens elke 15 seconden weg in de bijmij database onder retention policy raw in de measurement otmonitor. De otmonitor draait op <otmonitor IP>:8080 en de InfluxDB op de localhost:8086.

Grafana Dashboard
Het laatste stukje van deze puzzel is het Dashboard in Grafana maken. Laat Grafana nu een 'export' en 'import' functie hebben ingebouwd, ik kan dus eenvoudig mijn Dashboard met jullie delen.

Grafana draait op poort 3000, dus: http://<ip grafana>:3000

Het Dashboard kun je importeren bij Dashboard en dan Import, vervolgens een bestand kiezen. Als je nu dezelfde naamgeving hebt gebruikt als die van mij dan zou je een werkend Dashboard moeten krijgen. Heb je een andere naamgeving gekozen dan zul je de queries die onder de grafieken zitten aan moeten passen. Je kiest hier dan de juiste retention policy en dan de juiste measurement.


Nawoord
Als het goed is zou je nu een redelijk inzicht moeten krijgen in het gedrag van je OpenTherm CV ketel. Wees vrij om verbeteringen door te voeren, graag zie ik die dan terug zodat ik deze post kan updaten.

De installatie heb ik uit mijn hoofd gedaan, bij mij draait het al een tijdje, mocht er dus iets niet duidelijk zijn of iets niet werken zoals ik me herinneren laat me het dan weten dan ga ik dat uitzoeken en zal dan de post aanpassen.