HabAPP fail, cron win

Trying to make python work for OpenHabian rules…


  • Used the openhabian cli to install HabAPP.
  • The service didn’t start: ModuleNotFoundError: No module named ‘pydantic’
  • I knew I would need curl so…
pip3 install pydantic
sudo systemctl start habapp.service
sudo systemctl status habapp.service

The service still didn’t start. Is HabAPP running in a venv?

pip3 remove pydantic

I determined from the HabAPP documentation that it might run in a venv

openhabian@openhabian:/opt/habapp $ source ./bin/activate
pip3 install pydantic
sudo systemctl start habapp.service
sudo systemctl status habapp.service

Status now said I was missing a different module, EasyCo, and on I went installing and testing…

pip3 install EasyCo
pip3 install eascheduler
pip3 install stackprinter
pip3 install watchdog
pip3 install paho-mqtt
pip3 install aiohttp
pip3 install aiohttp_sse_client
pip3 install immutables
pip3 install bidict

And finally it worked! I was able to list the packages that are installed.

(habapp) openhabian@openhabian:/opt/habapp $ sudo systemctl status habapp.service
● habapp.service - HABApp
   Loaded: loaded (/etc/systemd/system/habapp.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2022-11-12 16:03:56 GMT; 2s ago
     Docs: https://habapp.readthedocs.io
 Main PID: 16102 (habapp)
    Tasks: 7 (limit: 4915)
   CGroup: /system.slice/habapp.service
           └─16102 /opt/habapp/bin/python3 /opt/habapp/bin/habapp -c /etc/openhab/habapp

Nov 12 16:03:56 openhabian systemd[1]: Started HABApp.
(habapp) openhabian@openhabian:/opt/habapp $ pip3 list
Package            Version
------------------ -------
aiohttp            3.8.3
aiohttp-sse-client 0.2.1
aiosignal          1.3.1
astral             2.2
async-timeout      4.0.2
asynctest          0.13.0
attrs              22.1.0
bidict             0.22.0
charset-normalizer 2.1.1
EAScheduler        0.1.7
EasyCo             0.2.3
frozenlist         1.3.3
HABApp             0.31.2
idna               3.4
immutables         0.19
multidict          6.0.2
paho-mqtt          1.6.1
pendulum           2.1.2
pip                22.3.1
pkg_resources      0.0.0
pycurl             7.45.1
pydantic           1.10.2
python-dateutil    2.8.2
pytz               2022.6
pytzdata           2020.1
ruamel.yaml        0.17.21
ruamel.yaml.clib   0.2.7
setuptools         65.5.1
six                1.16.0
stackprinter       0.2.9
typing_extensions  4.4.0
voluptuous         0.13.1
watchdog           2.1.9
yarl               1.8.1

I then endlessley faffed about with no success, watching the log with tail -f and duckduckgoing until I found this page which told me it was broken in OH3.3!! I went back in to the cli and removed HabAPP.

Back to plan A then. I will set up a venv and script to make it work with cron. I already have the script. Should have done this ages ago. All it does is tell me the kWh yesterday as a proof of concept. I already have an Item set up with the number.

import json
import pycurl
import certifi
from io import BytesIO
from openhab import OpenHAB

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://api.octopus.energy/v1/electricity-meter-points/xxxxxxxx/meters/xxxxxxxxxxxxxx/consumption/')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

body = buffer.getvalue()
usage = json.loads(body.decode('iso-8859-1'))
# Body is a byte string.
# We have to know the encoding in order to print it to a text file
# such as standard output.
count = 0
yesterday = 0
for x in usage["results"]:
    yesterday = yesterday + x["consumption"]
    count = count + 1
    if count == 48:
yesterday = round(yesterday,2)

base_url = 'http://openhabian:8080/rest'
openhab = OpenHAB(base_url)

# fetch all items
items = openhab.fetch_all_items()
items['Yesterday_kWh'].update(str(yesterday) + 'kWh')

And schedule that with cron by making a script to call it that has the full path to the venv inside calling the main.py

0 7 * * * /home/openhabian/projects/energy/energy.py