To my knowledge you must install your Python2 packages locally, i.e. in OPENHAB_CONF/automation/lib/python/
for openHAB+Jython to see & use it. On openHABian:
$ sudo -u openhab pip install --target=/etc/openhab2/automation/lib/python PYTHON_PACKAGE_NAME
Here’s what I did to make it work - credits go to the astral documentation:
$ sudo -u openhab pip install --target=/etc/openhab2/automation/lib/python astral
Here’s a test rule that works:
from core.rules import rule
from core.triggers import when
from core.actions import LogAction
import pprint
pp = pprint.PrettyPrinter(indent=4)
from org.joda.time import DateTime
import datetime
from datetime import date
from astral import Astral
rule_init_timestamp = DateTime.now()
logTitle = "astral.py@{ts}".format(ts=rule_init_timestamp.toString("HH:mm:ss"))
ruleTimeStamp = " -- (Rule set initialised {date} at {ts})".format(
date=rule_init_timestamp.toString("E d MMM yyyy"),
ts=rule_init_timestamp.toString("HH:mm:ss (z)"),
)
rulePrefix = "Astral | "
a = Astral()
a.solar_depression = "civil"
city_name = "Brussels"
city = a[city_name]
LogAction.logInfo(logTitle, "Information for %s/%s\n" % (city_name, city.region))
timezone = city.timezone
LogAction.logInfo(logTitle, "Timezone: %s" % timezone)
LogAction.logInfo(
logTitle,
u"Latitude: %.04f ° %s; Longitude: %.04f ° %s\n"
% (
city.latitude,
"S" if city.latitude < 0.0 else "N",
city.longitude,
"W" if city.longitude < 0.0 else "E",
),
)
sun = city.sun(date=date.today(), local=True)
LogAction.logInfo(logTitle, pp.pformat(sun))
moon_phase = a.moon_phase(date=date.today())
LogAction.logInfo(logTitle, "Moon phase: %.2f (%.2f %%)" % (moon_phase, 100*moon_phase/28.0))
Here’s the output for today:
==> /var/log/openhab2/openhab.log <==
2020-01-22 12:14:55.124 [INFO ] [me.core.service.AbstractWatchService] - Loading script 'python/personal/astral.py'
2020-01-22 12:14:55.809 [INFO ] [home.model.script.astral.py@12:14:55] - Information for Brussels/Belgium
2020-01-22 12:14:55.812 [INFO ] [home.model.script.astral.py@12:14:55] - Timezone: Europe/Brussels
2020-01-22 12:14:55.815 [INFO ] [home.model.script.astral.py@12:14:55] - Latitude: 50.8500 ° N; Longitude: 4.3500 ° E
2020-01-22 12:14:56.186 [INFO ] [home.model.script.astral.py@12:14:55] - { u'dawn': datetime.datetime(2020, 1, 22, 7, 55, 2, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>),
u'dusk': datetime.datetime(2020, 1, 22, 17, 52, 46, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>),
u'noon': datetime.datetime(2020, 1, 22, 12, 53, 54, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>),
u'sunrise': datetime.datetime(2020, 1, 22, 8, 32, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>),
u'sunset': datetime.datetime(2020, 1, 22, 17, 15, 48, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>)}
2020-01-22 12:24:28.670 [INFO ] [home.model.script.astral.py@12:24:28] - Moon phase: 25.00 (89.29 %)
Please note that in this script I’m using JodaTime (DateTime
) for generating a script timestamp and that the rule uses regular datetime
for execution.