Adding a smart meter to the Fibaro HC2

This is (sort of) a follow-up on my previous post about the cheap Serial to Ethernet converter. It has kept me busy for a couple of evenings, for several reasons:

  • I wanted to use the Arduino Nano as a web server;
  • Make the Nano return a JSON object containing the smart meter data;
  • Learn more about the Fibaro HC2 on the job;
  • The new sketch was unstable.

It was mostly that last item that kept me busy for some time – well, waiting describes it better actually, cause the sketch I initially wrote was doing what it should, but wasn’t stable – it stopped working after 2 hours, the next time after 20 hours.. totally unpredictable. I also saw the Nano was sometimes missing incoming serial P1 data. And of course, these sort of things never happen while you’re there to witness it: I was always either at work or asleep (or both ๐Ÿ˜‰ ).

So for a few days I tried to improve things and had to wait until the next day to see if the changes fixed the issue. It wasn’t lack of free RAM, it wasn’t the USB hub misbehaving, it wasn’t RF interference, nor was it a grounding issue. After I found a solution, the cause was very obvious actually: the Nano doesn’t do multitasking. Somehow taking care of receiving and processing serial data and handling an Ethernet shield interfered with each other – I still don’t know why, but after I denied the web server part of the sketch of servicing HTTP requests while the smart meter data was being received, this problem was solved. Detecting the beginning and end of a P1 packet is easy: it starts with ‘/’ and ends with ‘!’. So now the loop() looks like this:

void loop() {
  c = mySerial.read();
  switch (c) {
    case '/':
      receiving = true;
      ...
      break;
    case '!':
      receiving = false;
      ...
      break;
  }
  ...
  if(!receiving) {
    if (ether.packetLoop(ether.packetReceive())) {
      ...
      ether.httpServerReply(readingsPage());
    }
  }
}

With a P1 packet being about 500 bytes in size and 9600 baud this would ‘stall’ the response for about half a second (max.), which should not be a problem.

After I finally had a sketch that kept working for >48 hours it was time to have a look a the Fibaro HC2 and try to get the smart meter information (visibly) available in there.

Because I’ve spent very little time with the Fibaro HC2, please don’t put too much weight in what I have to say about the HC2, but: there’s one word that’s now associated with the HC2 in my head: impressive.ย The HC2 case feels solid, looks good, gets warm, the UI looks good, the power consumption is about 13.5 W doing nothingย (I had no Z-Wave hardware to add), and the HC2 has something calledย Virtual Devices. For me, that’s the thing I’m interested in the most – using the HC2 is not my thing, but exploring what I can do to add my own things to it is..

So after I hooked up the HC2 to my LAN, performed some upgrades and changed some settings, I immediately focused on those Virtual Devices. P1 Smart meter in Fibaro HC2I know I’ve just scratched the surface so far, but being able to create a Virtual Device within minutes and being able to get the smart meter data from the Nano web-server into Virtual Device properties and being displayed nicely as well with just a lua script of ~20 lines of code – that’s impressive! Not bad for a beginner ๐Ÿ˜‰ And for a price <20 Euro! Add a database solution, charting and I think the HC2 has a great future ahead.

 

Although I liked what I’ve seen so far, I do have some things that might be not so handy.

The lua script I wrote, was only 20 lines or so. Editing the code from within the browser, in a small window is not really as comfortable as editing code can/should be. And more important, everything you need in a script has to be in there (AFAIK) – so suppose you have to calculate a CRC, the CRC code has to be inside the script that needs it – no way of including source code files which will probably be used in more ‘main loops’ than just 1. I’d really like to see some sort of ‘Plugin’-ish way to add support for exotic hardware; a bunch of files with code, UI pages that can be embedded in the HC2 UI (e.g. for configuration stuff), creating Plugin specific triggers etcetera. In other words: really embed your own creations into HC2.

If Fibaro can accomplish that, then the HC2 can become the killer solution for Home Automation for a lot of people; with Z-Wave as the base technology, yet still expandable with support for other popular hardware.

Oh my, almost forgot the lua script, here it is:

--[[
%% properties
%% globals
--]]
fibaro:debug("start")
if (nano == nil) then
  nano = Net.FHttp("192.168.10.191", 80)
end
response, status, errorcode = nano:GET("/")
fibaro:debug(response)
local data
data = json.decode(response)
-- not 0 based!
jso = data[1]
v181  = jso.v181
v182  = jso.v182
v170  = jso.v170 * 1000
v2421 = jso.v2421
-- deviceid 7
fibaro:call(7, "setProperty", "ui.lbl181.value", v181.." kWh")
fibaro:call(7, "setProperty", "ui.lbl182.value", v182.." kWh")
fibaro:call(7, "setProperty", "ui.lbl170.value", v170.." W")
fibaro:call(7, "setProperty", "ui.lbl2421.value", v2421.." m3")
fibaro:sleep(10*1000)

Have fun!

Tagged , , . Bookmark the permalink.

14 Responses to Adding a smart meter to the Fibaro HC2

  1. Arthur says:

    I expect using the ENC28J60 instead of the WIZ5100 chipset creates issues due to the small (none?) caching.
    No problem as the smart meter pauses every time for 10 seconds…

    • Right, you have to be careful with the code. Even doing a while (mySerial.available()) {…} was too much, just like adding too many Serial.prints for debugging purposes – they messed things up pretty fast..
      I’m going to do the same thing with my Opentherm Gateway (connecting an Ethernet-Nano to it, I mean). The OT Gateway produces much more serial data, without any pause – we’ll see what happens ๐Ÿ˜‰

  2. klaas akkermans says:

    Robert,

    Ik ben met soortgelijke dingen bezig, maar zou het meer vanaf de aansturende kant willen doen.
    Dus bijvoorbeeld als de fibaro hc2 mij op een bepaalde afstand van mijn woning ziet dan het huis al begint te verwarmen.

    Ik heb dit al eerder met een ander systeem gebouwd en is goed en efficient. Met de standaard thermostaat van Remha/Calente is dat minder goed mogelijk.
    Ben jij hier al mee bezig geweest?

    Groetjes, Klaas

    • Hallo Klaas,
      Ik zou het relatief eenvoudig moeten kunnen maken want alle randvoorwaarden zijn aanwezig – maar dan in mijn eigen systeem (Node.js). De Fibaro staat hier alleen maar om af en toe wat mee uit te proberen, ervaring mee op te doen. Om met vloerverwarming en modulerende ketel het huis weer snel genoeg op te warmen voor als we thuis komen zou ik bv. direct op Schiphol de boel in werking moeten zetten (ik woon 10 min. van de Duitse grens), dus dan snap je denk ik wel dat dat niet echt goed zal werken hier. Ik heb daar een andere methode voor – ik kan het systeem in zgn. ‘vakantie’ mode zetten via mijn mobiel; dat gebruik ik als we bv. met het hele gezin een weekendje of langer weg zijn. Dan wordt ook automatisch de temperatuur lager ingesteld maar moet ik er dus wel zelf aan denken om op tijd de boel weer op te laten warmen, iets wat nog wel te automatiseren is ๐Ÿ˜‰ Geofencing gebruik ik dus eigenlijk nog niet.

      Groeten,
      Robert

  3. Paul Sinnema says:

    Ik begin net met de HC2 en vind het top. Ik kom van een Homewizard systeem waarmee alles erg simpel te koppelen is. Onder andere de mooie energie link.
    Ik lees hier een mooie oplossing voor het uitlezen van de slimme meter, maar ik ben niet thuis met de Arduino Nano en dergelijke.
    Wat heb ik precies allemaal nodig om dit te maken, of misschien wil je een kant en klare oplossing verkopen.
    Alvast bedankt.
    Groet Paul

    • Hallo Paul,
      Verkopen is niet mijn ding, straks wil je ook nog ‘garantie’ ;-). Het lua script staat al in de post, de rest kan ik je niet mee helpen want daarvoor weet ik te weinig van je mogelijkheden. Er zijn nl. talloze manieren om de gegevens van de slimme meter beschikbaar te maken. Heb je bv. een Raspberry, een NAS of iets anders wat 24 uur aan staat?

      • Paul Sinnema says:

        Hoi Robert,
        bedankt voor het antwoord. Nee ik verwacht geen garantie bij zulke projecten.
        De code is helder, ik heb wel iets elektronica ervaring maar dit is nieuw.
        Ik heb een Raspberry inclusief een z-wave module gekocht. Ook de Arduino Nano heb ik besteld.
        Nu alleen nog de twee aan elkaar knopen zodat de informatie via z-wave binnenkomt. De Arduino moet nog binnenkomen. De afstand tussen mijn slimme meter en HC2 is te groot voor een USB kabel.

        • Hoi Paul,

          Met de Raspberry en een kabeltje ben je er eigenlijk al!
          Dan ga ik er wel even vanuit dat je zowel de HC2 en de RPi aan je netwerk kunt verbinden.
          Bedraad of anders middels een Wifi module in de vorm van zo’n klein USB stompje.

          Dan neem je een FTDI kabel, herprogrammeert deze zoals hier staat uitgelegd en plaatst die tussen je Raspberry en slimme meter. Een NodeJS script van een paar regels doet dan de rest:

          – de slimme meter data inlezen en verwerken;
          – webservertje spelen voor het lua script op de HC2.

          Dat laatstgenoemde lua script staat dus al in deze post en een NodeJS script is zo gemaakt.
          Heb je al eens wat met NodeJS gedaan? Zo niet, dan kan ik je daar wel bij helpen.

  4. Paul Sinnema says:

    Hoi Robert,

    Dat is top dat dit zo kan en dat je me kan helpen.
    Ik heb een wifi usb stick besteld. Ik heb een slimmer meter kabel, een kant usb de andere kant p1 aansluiting.

    Met NodeJS nog geen ervaring, maar wordt tijd.
    LUA script heb ik gezien en is inderdaad helder. Ik heb op het Fibaro form een document gevonden met beschrijving hoe de RPi te programmeren. Ik weet alleen niet of dit ok is. Is hier te vinden. (Heeft trouwens ook verwijzing naar maartendamen.com) zoals jou verwijzing.

    http://forum.fibaro.com/viewtopic.php?t=4041&postdays=0&postorder=asc&start=15

    Kan je ook het document sturen, maar moet via mail denk ik. Hier is een stukje code.

    – maak python script aan dat meters uitleest en bestandje aanmaakt
    root@PI1:~# mkdir /var/www/scripts
    root@PI1:~# nano /var/www/scripts/p1json.py
    #
    # DSMR P1 uitlezer
    # (c) 10-2012 – GJ – gratis te kopieren en te plakken
    # 2014 aangepast voor Fibaro HC2 json door Roy van Manen
    versie = “1.1”
    import sys
    import serial
    import json
    ################
    #Error display #
    ################
    def show_error():
    ft = sys.exc_info()[0]
    fv = sys.exc_info()[1]
    print(“Fout type: %s” % ft )
    print(“Fout waarde: %s” % fv )
    return
    ###############################################################################$
    #Main program
    ###############################################################################$
    #Set COM port config
    ser = serial.Serial()
    ser.baudrate = 9600
    ser.bytesize=serial.SEVENBITS
    ser.parity=serial.PARITY_EVEN
    ser.stopbits=serial.STOPBITS_ONE
    ser.xonxoff=0
    ser.rtscts=0
    ser.timeout=20
    ser.port=”/dev/ttyUSB0″
    #Open COM port
    try:
    ser.open()
    except:
    sys.exit (“Fout bij het openen van %s. Programma afgebroken.” % ser.name)
    #Initialize
    # stack is mijn list met de 20 regeltjes.
    p1_teller=0
    stack=[]
    res=[]
    while p1_teller < 20:
    p1_line=''
    #Read 1 line
    try:
    p1_raw = ser.readline()
    except:
    sys.exit ("Seriele poort %s kan niet gelezen worden. Programma afgebroken." % ser.name )
    p1_str=str(p1_raw)
    #p1_str=str(p1_raw, "utf-8")
    p1_line=p1_str.strip()
    stack.append(p1_line)
    # als je alles wil zien moet je de volgende line uncommenten
    # print (p1_line)
    # print (p1_raw)
    p1_teller = p1_teller +1
    #Initialize
    # stack_teller is mijn tellertje voor de 20 weer door te lopen.
    # Waarschijnlijk mag ik die p1_teller ook gebruiken
    stack_teller=0
    while stack_teller < 20:
    # Afgenomen stroom daltarief 1-0:1.8.1
    if stack[stack_teller][0:9] == "1-0:1.8.1":
    res.append({'daldag': int(float(stack[stack_teller][10:15]))})
    # Afgenomen stroom piektarief 1-0:1.8.2
    elif stack[stack_teller][0:9] == "1-0:1.8.2":
    res.append({'piekdag': int(float(stack[stack_teller][10:15]))})
    # Daltarief, teruggeleverd vermogen 1-0:2.8.1
    elif stack[stack_teller][0:9] == "1-0:2.8.1":
    res.append({'dalterug': int(float(stack[stack_teller][10:15]))})
    # Piek tarief, teruggeleverd vermogen 1-0:2.8.2
    elif stack[stack_teller][0:9] == "1-0:2.8.2":
    res.append({'piekterug': int(float(stack[stack_teller][10:15]))})
    # Huidige stroomafname: 1-0:1.7.0
    elif stack[stack_teller][0:9] == "1-0:1.7.0":
    res.append({'vermogen': int(float(stack[stack_teller][10:17])*1000)})
    # Huidig teruggeleverd vermogen: 1-0:1.7.0
    elif stack[stack_teller][0:9] == "1-0:2.7.0":
    res.append({'terug_vermogen': int(float(stack[stack_teller][10:17])*1000)})
    # Gasmeter: 0-1:24.3.0
    elif stack[stack_teller][0:10] == "0-1:24.3.0":
    res.append({'gas': int(float(stack[stack_teller+1][1:10]))})
    # res.append('gas': int(float(stack[stack_teller+1][1:10])))
    else:
    pass
    stack_teller = stack_teller +1
    #print (stack, "n")
    #print res
    # nu bevat de json als je hem dumpt een string alsvolgt:
    # [{"daldag":5000}, {"piekdag":3400}, …. ]
    # omvormen naar:
    # [{"daldag":5000 , "piekdag":3400, … ]
    #
    tmpstr = (json.dumps(res)).replace("}, {",", ")
    # schrijf naar een file
    tmpfile = open("/var/tmp/jsonmeters.txt","w")
    tmpfile.write(tmpstr)
    tmpfile.close
    #Close port and show status
    try:
    ser.close()
    except:
    sys.exit ("Oops %s. Programma afgebroken." % ser.name )
    tik control-X,
    dan Y en ENTER
    om het bestandje op te slaan
    – zet het script neer dat de meters uitleest en teruggeeft in de browser
    root@PI1:~# nano /var/www/readmeter.php
    plak onderstaande tekst erin

    tik control-X,
    dan Y en ENTER
    om het bestandje op te slaan
    Nu kun je met je browser naar ipnr van de pi en de meterstanden opvragen:
    http://192.168.1.16/readmeter.php
    geeft zoiets in de browser:
    [{“daldag”: 5152, “piekdag”: 4624, “dalterug”: 0, “piekterug”: 0, “vermogen”: 630, “terug_vermogen”: 0,
    “gas”: 2833}]

  5. Peter says:

    Hoi Paul,

    Ik ben ook nieuw met arduino. Heb na aanleiding van deze website de Arduino Mini USB Nano V3.0 ATmega328 5V met ENC28J60 Ethernet Shield for Arduino Nano 3.0 RJ45 besteld voor de kopeling met de Fibaro HC2. Als ik de arduino code probeer in te voeren in de IDE is hij volgens mij niet volledig. Heb al wat toegevoegd met behulp van andere web sites maar volgens mij ontbreekt er nog meer code. Kun je mij nog wat verder helpen?

    mvg Peter.

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    char c;
    char receiving;
    SoftwareSerial mySerial(2, 3); // RX, TX

    void setup() {
    // put your setup code here, to run once:

    }

    void loop() {
    // put your main code here, to run repeatedly:
    c = mySerial.read();
    switch (c) {
    case ‘/’:
    receiving = true;

    break;
    case ‘!’:
    receiving = false;

    break;
    }

    if(!receiving) {
    if (ether.packetLoop(ether.packetReceive())) {

    ether.httpServerReply(readingsPage());
    }
    }
    }

    • Samuel says:

      De serieele data krijg ik binnen op pin 7 (D07) Ik kan via de debug de ip adres en data uitlezen via de serieel monitor, maar krijg via de Fibaro HC2 nog niets binnen, ik heb naar je voorbeeld gekeken en geprobeerd het om te zetten, maar dat is niet gelukt. , Zou je de volledige code van de nano naar me kunnen sturen zodat ik de smart meter kan inlezen op de fibaro? Alvast bedankt

  6. Falcon says:

    Ok, krijg dit dus niet voor elkaar. Mijn slimme meter (en kabel) werken, want die heb ik al op een andere manier werkend. Met het eerste script krijg ik geen foutmelding bij compilen. Bij aansluiten zie ik ook keurig in mijn router het MAC en IP via DHCP. als ik echter naar het IP browse “unable to connect” en ook de fibaro krijgt geen getallen geserveerd.

    Is er een manier om dit te debuggen?

  7. Pingback: Adding a Plugwise Smile to the Fibaro HC2 - Digits Domotica Blog

Leave a Reply

Your email address will not be published. Required fields are marked *