Jump to content
plonkster

Python code to log to pvoutput.org from venus/ccgx

Recommended Posts

Hi all,

This is something I've wanted to do for a long time. This is very raw still, probably needs a lot more work, and of course you need a CCGX, Venus-GX, or you need to run Venus on your Raspberry Pi. Nevertheless, here it is.

There are some assumptions in this, such as that you don't have PV-inverters anywhere, and that you have a grid meter. This should however work in off-grid settings as well.

For now, this is my little site, some mistakes were made in the beginning, but it should even out eventually :-)

 

Share this post


Link to post
Share on other sites

What's actually funny about this is that power going into the batteries is being logged as "export" and taking power from the batteries are show as import. Which is probably right on some level. How is this handled by other software?

Looking at their documentation, it doesn't look as if this is really designed with battery/self-consumption rigs in mind.

Share this post


Link to post
Share on other sites

So I noticed that it's using the wrong timezone. That's because the CCGX uses UTC as its system timezone, and the actual timezone is stored in local settings. So I added a few lines of code to correctly set the timezone environment variable.

The code now has a proper repo here.

Share this post


Link to post
Share on other sites

@plonkster I don't have an energy meter and was wondering if you could advise.  I get the following error...

Thanks

Mark

INFO:__main__:Found solarchargers at com.victronenergy.solarcharger.ttyS6, com.victronenergy.solarcharger.ttyS7
INFO:__main__:Found grid meters at
INFO:__main__:Found vebus at dbus.Array([], signature=dbus.Signature('i'), variant_level=1)
Traceback (most recent call last):
  File "dbus-pvoutput.py", line 148, in <module>
    main()
  File "dbus-pvoutput.py", line 104, in main
    track(conn, consumers, vebus, "/Energy/InverterToAcOut", "c1")
  File "dbus-pvoutput.py", line 58, in track
    state[target] = value = unwrap_dbus_value(query(conn, service, path))
  File "dbus-pvoutput.py", line 54, in query
    return conn.call_blocking(service, path, None, "GetValue", '', [])
  File "/usr/lib/python2.7/site-packages/dbus/connection.py", line 638, in call_blocking
    method=method)
ValueError: Invalid bus name 'dbus.Array([], signature=dbus.Signature('i'), variant_level=1)': contains invalid character '('

Share this post


Link to post
Share on other sites
1 hour ago, Mark said:

INFO:__main__:Found vebus at dbus.Array([], signature=dbus.Signature('i'), variant_level=1)

There's your problem. Nothing to do with not having a meter, the script can work with zero meters.

The above usually means the Multi is off or not found for whatever reason. On line 92 you'll see it query systemcalc to get the vebus service, and this should respond with something like com.victronenergy.vebus.ttyO5, but instead it responds with an empty array, which in Venus land is used to indicate that the value is undefined.

I just remembered again tonight why it had to be so unwieldy... its because .system does not keep track of the energy values, only power, so I had no choice. That... and it was written after lunch on boxing day 🙂

 

Share this post


Link to post
Share on other sites

@plonkster I don't have an energy meter and was wondering if you could advise.  I get the following error...

Th

8 hours ago, plonkster said:

There's your problem. Nothing to do with not having a meter, the script can work with zero meters.

The above usually means the Multi is off or not found for whatever reason. On line 92 you'll see it query systemcalc to get the vebus service, and this should respond with something like com.victronenergy.vebus.ttyO5, but instead it responds with an empty array, which in Venus land is used to indicate that the value is undefined.

I just remembered again tonight why it had to be so unwieldy... its because .system does not keep track of the energy values, only power, so I had no choice. That... and it was written after lunch on boxing day 🙂

 

Thanks for the reply.

Is there a chance I can "give it a value" in some way to get over this issue?   or get rid of this check ;)

Regards

Mark

Share this post


Link to post
Share on other sites
Posted (edited)
1 hour ago, Mark said:

Is there a chance I can "give it a value" in some way to get over this issue?   or get rid of this check ;)

It's strange that that call fails. If you run manually on the commandline, for example on a cerbo:

[email protected]:~# dbus -y com.victronenergy.system /VebusService GetValue
'com.victronenergy.vebus.ttyS4'

That is the service name of the vebus, and that is the value you should get in the vebus variable. So you could skip that and just hardcode it if you know where yours is, eg:

# Instead of...
vebus = str(query(conn, "com.victronenergy.system", "/VebusService"))

# do
vebus = 'com.victronenergy.vebus.ttyS4'

But that still does not explain why systemcalc is not seeing your Multi...

On a CCGX, the last bit is ttyO1, on a Venus-GX and an Octo-GX it is ttyO5, and on a Cerbo it is ttyS4. On a Raspberry Pi it is ttyUSBsomething, depending on order it was detected.

Edited by plonkster

Share this post


Link to post
Share on other sites

Hi @plonkster

Thanks for reply... to clarify and I see above I forgot to mention I have no multi connected (sorry for misinfo).

2x MPPT's and a battery (Pylon) on the BMS CAN.

A Cerbo received yesterday and I would like to capture MPPT production to PVO and EMONCMS.

Using your PVO code and Paul's EMONCMS modification of your code...

I have tried the hard coding of the above: 

vebus = 'com.victronenergy.vebus.ttyS4'

But I guess it still needs the multi to respond... 

Regards

Mark

 

Share this post


Link to post
Share on other sites

Comment out these two lines:

    track(conn, consumers, vebus, "/Energy/InverterToAcOut", "c1")
    track(conn, consumers, vebus, "/Energy/InverterToAcIn1", "c2")

This will cause the consumers dictionary to be empty, cause you also have no meter. energy_consumed will then be zero in the _upload function, so it will end up logging only the generation.

The script was never really improved after the initial version, so it has always required the Multi to be there to work.

Share this post


Link to post
Share on other sites

Making some progress... I think...   (full disclosure... I know nothing about python ;) )

[email protected]:/data# python dbus-pvoutput.py
INFO:__main__:Found solarchargers at com.victronenergy.solarcharger.ttyS6, com.victronenergy.solarcharger.ttyS7
INFO:__main__:Found grid meters at
INFO:__main__:Found vebus at com.victronenergy.vebus.ttyS4
Traceback (most recent call last):
  File "/usr/lib/python2.7/logging/__init__.py", line 861, in emit
    msg = self.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 734, in format
    return fmt.format(record)
  File "/usr/lib/python2.7/logging/__init__.py", line 465, in format
    record.message = record.getMessage()
  File "/usr/lib/python2.7/logging/__init__.py", line 329, in getMessage
    msg = msg % self.args
TypeError: float argument required, not NoneType
Logged from file dbus-pvoutput.py, line 117
Traceback (most recent call last):
  File "dbus-pvoutput.py", line 148, in <module>
    main()
  File "dbus-pvoutput.py", line 141, in main
    _upload()
  File "dbus-pvoutput.py", line 127, in _upload
    "v4": int(stats.pc),
TypeError: int() argument must be a string or a number, not 'NoneType'
[email protected]:/data#

Share this post


Link to post
Share on other sites
7 hours ago, Mark said:

    "v4": int(stats.pc),

Again, that is maintained by the line that tracks the energy value on systemcalc, but that is unset cause you have no Multi. So just replace stats.pc with a zero... and comment out any places it is tracked...

Share this post


Link to post
Share on other sites

Thanks for the help @plonkster - much appreciated.  I have a feed working and hope to refine a improve it a bit!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Topics

Contact Us - Power Forum South Africa

×
×
  • Create New...