Hold oversikt over strømforbruket med data fra Tibber

Jeg skaffet en Tibber Pulse som jeg koblet opp i sikringsskapet. Den måler strømforbruket hvert 2.5 sekunder og jeg kan få tak i de dataene. Jeg kan holdeøye med forbruket og også se dette sammen med fremtidig strømpris og temperatur. Jeg seteter opp et dashboard i Grafana. Serversystemene kjøres på en linux server jeg har gående. Nøyaktig det samme oppsettet skal kunne kjøres på de fleste nyere linux systemer som bruker systemd (inkludert rasbian på rasberry pi). Dersom du bruker et system som ikke har systemd, vil alt fungere med unntak av oppsettet for autostart. For å hente inn værvarsel,se http://sickel.net/blogg/?p=1923.

Inntil videre tar jeg omveien via Tibbers skyløsning. PyTibber gir et oppsett som gjør dette enkelt. Da kan data hentes inn enkelt etter et “pip install tibber”:

#!/usr/bin/python3

import asyncio
import aiohttp
import tibber
import json  

ACCESS_TOKEN = "Tibber access token"
FILE='/var/www/html/homelog2/pulse.json'
# Can be picked up by my webserver

async def _callback(pkg):
    data = pkg.get("data")
    if data is None:
        return
    pulsedata=data.get("liveMeasurement")
    with open(FILE,'w') as outfile:
        json.dump(pulsedata,outfile)
    

async def run():
    async with aiohttp.ClientSession() as session:
        tibber_connection = tibber.Tibber(ACCESS_TOKEN, websession=session)
        await tibber_connection.update_info()
    home = tibber_connection.get_homes()[0]
    await home.rt_subscribe(_callback)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    asyncio.ensure_future(run())
    loop.run_forever()

Dette scriptet henter data fortløpende og lagrer det som en json fil i en katalog som serves av en http-server. Jeg ønsker at dette skal kjøre kontinuerlig og starte automatisk om serveren starter om, så jeg har kopiert pythonscriptet til /usr/local/bin og definert en service-fil:

[Unit]
Description=Tibber pulse collector
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
StartLimitIntervalSec=500
StartLimitBurst=5

[Service]
Type=simple
ExecStart=/usr/local/bin/tibberpulse.py
User=morten
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Dette er lagret som /etc/systemd/system/tibberpulse.service. For å få dette til å kjøre, må man fortelle systemd at det finnes nye service-filer, så starte servicen og til slutt sette at den skal startes med reboot. Dette er følgende kommandoer:

sudo systemctl daemon-reload
sudo systemctl start tibberpulse.service
sudo systemctl enable tibberpulse.service

Da kan man skjekke at servicen kjører:

morten@sjest:~(master)$ systemctl status tibberpulse.service 
● tibberpulse.service - Tibber pulse collector
     Loaded: loaded (/etc/systemd/system/tibberpulse.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-12-18 17:27:59 CET; 5 days ago
   Main PID: 120163 (tibberpulse.py)
      Tasks: 2 (limit: 19086)
     Memory: 28.3M
        CPU: 6min 24.729s
     CGroup: /system.slice/tibberpulse.service
             └─120163 /usr/bin/python3 /usr/local/bin/tibberpulse.py

Dec 22 18:02:10 sjest tibberpulse.py[120163]:   File "/home/morten/.local/lib/python3.9/site-packages/graphql_subsc>
Dec 22 18:02:10 sjest tibberpulse.py[120163]:     msg = await asyncio.wait_for(self.websocket.recv(), timeout=30)
Dec 22 18:02:10 sjest tibberpulse.py[120163]:   File "/usr/lib/python3.9/asyncio/tasks.py", line 481, in wait_for
Dec 22 18:02:10 sjest tibberpulse.py[120163]:     return fut.result()
Dec 22 18:02:10 sjest tibberpulse.py[120163]:   File "/home/morten/.local/lib/python3.9/site-packages/websockets/le>
Dec 22 18:02:10 sjest tibberpulse.py[120163]:     await self.ensure_open()
Dec 22 18:02:10 sjest tibberpulse.py[120163]:   File "/home/morten/.local/lib/python3.9/site-packages/websockets/le>
Dec 22 18:02:10 sjest tibberpulse.py[120163]:     raise self.connection_closed_exc()
Dec 22 18:02:10 sjest tibberpulse.py[120163]: websockets.exceptions.ConnectionClosedError: no close frame received >
Dec 23 00:08:01 sjest tibberpulse.py[120163]: No data, reconnecting.

Den har feilet noen ganger, men har blitt startet opp igjen og har kjørt uten problemer i halvannet døgn. (Feilen 22 skyldes sannsynligvis at jeg koblet om en nettverkskabel, den burde vært håndtert med en try – except)

Jeg vil også ha inn data om nåværend og fremtidig strømpris. For å gjøre ting enkelt, henter jeg inn dette en gang i timen med crontab (fyll inn egen Tibber-token):

1 * * * * /usr/bin/curl -H "Authorization: Bearer Tibber-token" -H "Content-Type: application/json" -X POST -d '{"query":"{ viewer { homes { currentSubscription{ priceInfo{ current{ total energy tax startsAt } today { total energy tax startsAt } tomorrow { total energy tax startsAt } } } } } }"}' https://api.tibber.com/v1-beta/gql > /var/www/html/homelog2/cost.json

I grafana lager jeg tre datakilder basert på JSON-API som henter inn pulse.json, cost.json og weather.json fra webserveren min. For viserinstrumenetene, er det bare spørring etter et parameter,som eksempel for aktult effekttrekk:

De to andre blir litt mer kompliserte, for aktuell strømpris er Field
$.data.viewer.homes[*].currentSubscription.priceInfo.current.total

og for temperatur er det
$.properties.timeseries[*].data.instant.details.air_temperature

For tidsserien må jeg både hente inn tidspunkt og verdi:

Den øverste henter (resten av) dagens strømpriser, den midterste henter temperaturvarsel (JSON API er et navn jeg satt på datakilden før jeg forsto hvordan den navningen fungerer. Hadde jeg satt det opp nå, ville den hett “metdata”). Den siste henter morgendagens strømpriser.

For klipp og lim:

$.data.viewer.homes[].currentSubscription.priceInfo.today[].startsAt
$.data.viewer.homes[*].currentSubscription.priceInfo.today[*].total
$.properties.timeseries[*].time
$.properties.timeseries[*].data.instant.details.air_temperature
$.data.viewer.homes[*].currentSubscription.priceInfo.tomorrow[*].startsAt
$.data.viewer.homes[*].currentSubscription.priceInfo.tomorrow[*].total

Dersom man av en eller annen grunn ønsker seg strømprisen uten avgifter, bruk “energy” i stedet for “total” i de aktuelle felten

Posted in Diverse | Leave a comment

Presenter strømpris og værvarsel i grafana

Plutselig måtte man holde øye med strømprisene og tenke litt på hva man gjør når. Dersom man har en strømleverandør som tilbyr et API for strømforbruk og strømpriser, slik som tibber gir det en del muligheter.

I tibbers api er det blant annet mulig å hente strømforbruke og strømpriser for lang tid tilbake og strømpriser for inneværende og kommende dag. (Sistnevnte når den er satt). Når man har hentet en API-token, kan strømprisene kan hentes ned:

/usr/bin/curl -H "Authorization: Bearer <min token>" -H "Content-Type: application/json" -X POST -d '{"query":"{ viewer { homes { currentSubscription{ priceInfo{ current{ total energy tax startsAt } today { total energy tax startsAt } tomorrow { total energy tax startsAt } } } } } }"}' https://api.tibber.com/v1-beta/gql > /var/www/html/temp/cost.json

Jeg kjører dette fra cron med passende intervall og lagrer datasettet til en katalog som en webserver har tilgang til, så bruker jeg grafana til å presentere data:

Dette viser nåværende strømpris (1.85 / kWh) og forventet utvikling for inneværende og neste dag

For å hente dette inn i grafana, må jeg først lage en datakilde. Jeg bruker JSON API datakilden. Denne setter jeg opp så webserveren henter inn jsonfilen jeg lagret. (http://<webserver>/temp/cost.json).

Når jeg har hentet json filen inn i grafana, må jeg hente ut dataene jeg ønsker. Dette settes opp med jsonpath queries. Jeg må gi grafana tidspunktene og prisene. For å få dette må jeg sette opp en datakilde med to felt:

$.data.viewer.homes[*].currentSubscription.priceInfo.today[*].startsAt
$.data.viewer.homes[*].currentSubscription.priceInfo.today[*].total

Det første feltet gir et starttidspunkt, det andre gir prisen fra det tidspunktet. Dataene ligger i to sett, et for inneværende dag og et for neste dag, dermed må man sette opp en datakilde til hvor feltene i stedet inneholder priceInfo.tomorrow. Siden grafana i utgangspunktet er et system for å logge noe som har skjedd, må det trikses til litt for å få plottet data for fremtiden. Gå inn på query options og sett “Relative time” til “+2d”

Den enkleste måten å få ut aktuell strømpris er å bruke priceInfo.current som et datasett

$.data.viewer.homes[*].currentSubscription.priceInfo.current.total 

Disse dataene kan også kombineres med temperaturvarsel.

Posted in Diverse | Leave a comment

Presentere fortid og fremtid sammen i Grafana

Når man logger meteorologiske data er det spennende å se hvordan øyeblikksdataene henger sammen med varslede data. Når man bruker Grafana til å presentere data, kan disse kobles sammen og presenteres som en enhet.

Loggede data sammen med varslet vær. Tempereratursensoren er for nær huset og viser gjerne litt for høy temperatur. For å få trykket til å passe, måtte jeg justere for høyde.

Data fra meteorologisk institutt er tilgjengelige på https://api.met.no. For eksempel for å hente værvarsel for 60N 15E på json format, bruk

https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=60.000&lon=15.000

Dette datasettet oppdateres ca hver 6. time. For å la api.met.no være mest mulig i fred, henter jeg ned dataene med cron med passende mellomrom og lagrer lokalt i en katalog som er tilgjengelig for en webserver (sett inn din gyldige epost for “din epost”) :

/usr/bin/curl -s -A "<din epost> "https://api.met.no/weatherapi/locationforecast/2.0/complete?lat=60.000&lon=15.000" > /var/www/html/forecast/weather.json 2>/dev/null

Dermed kan jeg få tak i værvarselet på http://minserver/forecast/weather.json

I Grafana kan jeg da installere json api data source plugin. Den må settes opp for hver adresse det skal hentes data fra og konfigureres med urlen som dataene kan hentes fra. Da kan denne defineres som en datakilde for et grafana panel. For å få ut tidspunkter og temperaturer, måtte jeg sette opp to felter:

Grafana viser normalt data for noe som har skjedd. For å vise fremtidig varslet vær, må tidsskalaen forskyves for panelet:

Her er det dyttet 20 dager ut og så trukket 11 dager tilbake. Jeg fikk det ikke til å fungere ved å bare skyve 9 dager ut.

Data for logget vær henter jeg fra en vanlig tidsseriedatabase (i mitt tilfelle fra PostgreSQL, men alle slags datakilder som Grafana kan plotte en graf fra kan brukes). Værvarselet er satt opp som et kombinert søyle- og linjediagram. Dermed vises det tydelig for hvilken tidsperiode dataene kommer inn med høyere oppløsning.

Husk å kreditere met.no på panelet.

Posted in Diverse | 2 Comments

Fritzing – Stripboard 4 joint grid

I couldn’t find any, so I modified a standard Fritzing stripboard to represent a small 4joint grid Stripboard. I hope somebody can find it useful. (Click image to download, or go here.)

Stripboard4jointgrid_bb

Posted in Diverse | Comments Off on Fritzing – Stripboard 4 joint grid

Eplehøsten 2015

Nesten ny rekord – dvs det er vel rekord med egne epler og om jeg hadde villet presse et par runder ren aroma, hadde det blitt ny rekord:
8 runder stort sett bare James Grieve 128 kg – 64 liter, eller kanskje mer, fikk stort sett over åtte liter pr runde i år
1 runde blandet – 8 liter
1 runde Torstein – 8 liter etter mye jobb.

Posted in Diverse | Comments Off on Eplehøsten 2015

Den hippokratiske ed for et nytt årtusen

På tide med en oppdatering så helsepersonell vet å sette de riktige tingene først:

Jeg lover:
Å holde foretaksledelsen like kjær for meg som mine foreldre;
å leve sammen med den og om nødvendig dele all min fritid med den;
å anse dens konsulenter som mine egne brødre,
å lære av dem deres kunst hvis de ønsker mot betaling og skriftlig taushetserklæring;
å overlevere kunnskap til helseforetakets konsulenter, men til ingen andre.
Jeg vil bruke mine evner for det beste for helseforetaket i samsvar med min dyktighet og min dømmekraft og aldri volde noen informasjonslekkasje.
Jeg vil ikke gi informasjon til noen som ber om det, heller ikke gi råd til hvordan de kan finne denne. Ei heller vil jeg gi noe media kunnskap som fører til at helseforetaket kommer i et dårlig lys.
Men jeg vil holde både mitt liv og min kunst ren. Jeg vil ikke varsle anonymt, selv om det ville vært for pasientenes og samfunnets beste;
jeg vil overlate dette til å bli utført av helseforetakets informasjonskonsulenter
I ethvert hus jeg kommer til vil jeg gå inn bare for helseforetakets beste, holde meg selv langt fra all forsettelig informasjonsspreding og all forlokkelse til å dele kunnskap med kvinner eller menn, fri eller trell.
Alt som kommer til min viten under utøvingen av mitt yrke eller i daglig samkvem med helseforetaket, som ikke burde bli kjent for andre, vil jeg holde hemmelig og aldri avsløre.
Hvis jeg holder denne ed trofast, vil jeg kunne nyte mitt liv og utøvingen av min kunst, respektert av alle helseforetak i all tid; men hvis jeg bli avledet fra min ed eller bryte den, måtte så det motsatte bli min byrde.

Posted in Diverse | Comments Off on Den hippokratiske ed for et nytt årtusen

Reasons to hate Crystal Reports

1) It neither reads or can write numbers in scientific notation – that is true, if some of those comes into your report, you need to write a script that splits on the “E” and calculate from there
2) Hopeless debugging. It is ok to get a warning when some code will not run, but if you makes it return early for debugging, then the code will not run.
3) It is only able to rotate a text 0,90,180,270 degrees.
4) It is not possible to edit the sql outside the Database idiot, sorry database expert.

More to come

Posted in Diverse | Comments Off on Reasons to hate Crystal Reports

Observationlogger

This app is made primary for field biologists logging animal behaviour, but it should also be usable for other types of classification logging. The logged data are sent to a user definable server.

Screenshot_2015-03-01-22-29-38

Logging is done by dragging a value from one of the fields on the bottom of the screen to the top of the screen and then press “Confirm”. If one realizes just after pressing Confirm that the observation was wrong, “Undo” is available to send an undo-message to the server. To make the possibility of registering or undoing observation by accident as small as possible, the “Confirm” button is only available for a short (default 20 sec, but user configurable) time after dragging an registration and the “Undo” button is available for the same time after pressing Confirm.

When an observation is logged, the gps-position from the phone is also logged.

The following data are uploaded: Text of field dragged from and dropped on, timestamp, an identification of the installation, a username and a projectname as well as latitude, longitude, altitude, the gps’ accuracy estimate and the gps-time. Username, uuid and project may be used for distinguishing between various field workers possibly working in different parts of a project. A typical server call in the application looks like this:

/obstst/?drop=Other&ts=2015-03-03+21.00.58&drag=260&uuid=6b7a6f20-fa13-4d8c-b792-7b85dbf9fa5b&username=morten&project=test&lat=59.66518166666666&lon=10.638696666666666&alt=64.5&acc=9.9&gpstime=1425412853000

The the app is on google play. The source code can be found on github.

Posted in Diverse | Comments Off on Observationlogger

Vedsjau

Jeg har noen bekjente med vedkløyver, de er stort sett fornøyde med det og noen av dem spør meg fra tid til annen om jeg vil låne den. Jeg sier nei. Å klyve ved med øks er mentalhygiene på høyt plan. Det er nesten litt julaftensstemning å begynne med det. En stor haug med kappet ved som skal avsløre sine hemmeligheter. Jeg går rundt haugen et par ganger, kikker på den og prøver å anslå hvor mye plass jeg må gjøre klar til vedstabel. Når alt er klart, kan arbeidet begynne og jeg plukker ut en kubbe som ser passende ut. Etterhvert skrir arbeidet framover og jeg finner kubber som er som smør – de kløyver seg omtrent bare jeg ser litt hart på dem og de lager perfekte halv- eller kvartkubber for vedstabelen. Av og til er det en kubbe som er såpass stor at den krever ekstra planlegging og noen ganger er det kubber som viser seg å inneholde kvister og vridninger som gjør kløyvingen av dem til en mye større jobb enn hva øyemålet sa i første runde. Men – tiden går. Haugen med rundved minker og stabelen med kløyvet ved vokser. Selv om kontorkroppen etterhvert begynner å si i fra at dette er den ikke vant med, så trenges ingen motivering eller coaching. Formålet på kort tid er klart – at arbeidet går framover er lett å se – og jeg vet med hele kroppen hva som blir det endelige resultatet av arbeidet utover neste vinter. Noe designbyrå trenges heller ikke, for den saks skyld. Designen er funksjonell og velprøvd. Noen vil kanskje beskylde meg for å være litt vel konservativ der jeg følger familietradisjonen og lager en lang rett stabel med et kattehus i hver ende.
Men som med julaften – på et tidspunkt vet barna at de gavene som er igjen til dem inneholder stort sett sokker og de voksne vet at om det er noe igjen til oss, er det sannsynligvis en eller annen juledekorasjon man aldri ville drømt om (annet enn i et mareritt) å kjøpe selv, men som man allikvel på et eller annnet tidspunkt må gjøre rede for for giveren. I vedhaugen blir det færre og færre “smørkubber” å finne. Stabelen begynner å bli så høy at jeg må konsentrere mer for å legge den stabilt, Stadig oftere tar jeg meg i å tenke “Er egentlig dette noe lurt?” mens jeg støtter opp en kubbe med venstre hånd for at den ikke skal velte mens jeg smeller øksa i den, jeg skuler stygt på noen grove kubber som deler seg i en krone av rimelig grove greiner og jeg kikker på noe småkvist og lurer litt på om “Hører de der egentlig hjemme i vedstabelen eller på komposthaugen?”
Til slutt har jeg kommet så langt jeg klarer. Noen ting som det ikke er vits i å kløyve med allikevel for grovt for komposten får dratt av litt bark og blir lagt i stabel, noe blir definert som rask og hevet i komposten, jeg legger øksa i vedskjulet og stikker over til naboen for å høre om jeg kanskje kan få låne vedkløyveren for å få tatt de uhåndterlige forgrenede kubbene som ligger igjen.

Posted in Diverse | Comments Off on Vedsjau

Eplehøsten 2014

Eplehøsten virket bra - helt til jeg plukket...

Dette så jo bra ut, med nærmere kontroll var det ikke så mye

Rett og slett en av de dårligeste noensinne! Trodde lenge at det skulle bli et, i hvert fall, normalt godt år,men nei da. Det var vel for tørt. Presset to runder, 32 kg epler, fra egne trær (80% torstein) og to runder med epler jeg fikk fra andre. I tillegg gikk det noe epler i kaker og spist på direkten. Får håpe 2015 blir bedre i så måte…

Tror forresten tverrliggeren på eplepressa bør byttes før neste sesong.

Posted in epler | Comments Off on Eplehøsten 2014