[SOLVED] Australian Bureau of Meteorology Weather Forecast Binding

My thoughts are:

I’m probably thinking the forecast data should be presented in the the forecast section. Some people might conceivably run comparisons between the forecast and the the observations so mixing them up wouldn’t be ideal

So between the two suggestions I’d vote for the former. And of course if the XML contains actual min data then you’d use that as a preference

I get the Sydney Metro feed and apparent temp is never there and have noticed a few items go dead as well. Added in the Open Weather Binding, but again no apparent temp. Slowing moving to Dark Sky now via Node Red, thou found a way to pull fairly directly into Openhab via the HTTP cache and JSON option.

Bit surprised as the Oz BOM is supposed to the definitive source, which may be true for the items the do provide and when they do.

im just using the last available data so i got something can you write in some paramaters into the binding and have different options depending on the need?

Hi @tomitan, if you look at my sitemap above, you’ll notice many options commented out, mostly they are not available with the exception of “ForecastIcon” and “ForecastDescription”, and I do use the former to provide my date/time icon. The rest are empty.

I even use one that is empty being “MaximumPrecipitation” just to balance the frame display for each day.

Minimum Temp works occasionally for the current day (do use it for future forecasts), but I have little need for it in the tropics anyway. Have a weather station that I use for that.

Hi Lucas and all,

The feature is now in the latest build. Sorry for the delay. I wanted to finish BOM radar image loop generation before releasing the changes.

Anyway by default, the min/max temperature will be retained as discussed. To disable in Paper UI use the following toggle:

If you are interested in radar image loop generation please see the updated documentation https://github.com/tomitan100/org.openhab.binding.bom/blob/master/README.md. Would like to hear from you guys if there are any defects as I do not have time to test all possibilities.

Regards,
Tom

1 Like

The images are a cool extra Tom. I’ve been doing something similar for 4-5 years with a bash script that runs under a cron job for radar and satellite images. I also overlay timestamps and location markers.

2hr Radar Loop (configurable)

24hr Satellite Loop (also configurable) scaled at %30 so I could upload.
satelliteLoop_20190414_0432_Scaled30

1 Like

Hi @rastus_rob
Would you be willing to share your scripts? I have a basic radar script going but would love to add some features to it! :grin:
Cheers!

1 Like

Hi @tomitan

Thanks for your ongoing work on this script.
I am getting some log errors. See below:

2019-04-14 12:29:10.594 [INFO ] [org.openhab.binding.bom             ] - FrameworkEvent INFO - org.openhab.binding.bom
java.io.IOException: Exception in opening zip file: /volume1/public/openHAB/userdata/cache/org.eclipse.osgi/276/0/bundleFile
	at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:321) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.basicOpen(ZipBundleFile.java:93) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.getZipFile(ZipBundleFile.java:106) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.checkedOpen(ZipBundleFile.java:65) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.getEntry(ZipBundleFile.java:240) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.BundleFile.getResourceURL(BundleFile.java:136) ~[?:?]
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findResourceImpl(ClasspathManager.java:418) ~[?:?]
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalResources(ClasspathManager.java:395) ~[?:?]
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalResources(ModuleClassLoader.java:324) ~[?:?]
	at org.eclipse.osgi.internal.loader.BundleLoader.findLocalResources(BundleLoader.java:860) ~[?:?]
	at org.eclipse.osgi.internal.loader.BundleLoader.findResources(BundleLoader.java:716) ~[?:?]
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.getResources(ModuleClassLoader.java:234) ~[?:?]
	at org.eclipse.osgi.internal.framework.ContextFinder.getResources(ContextFinder.java:165) ~[?:?]
	at java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:348) ~[?:?]
	at java.util.ServiceLoader$LazyIterator.access$600(ServiceLoader.java:323) ~[?:?]
	at java.util.ServiceLoader$LazyIterator$1.run(ServiceLoader.java:396) ~[?:?]
	at java.util.ServiceLoader$LazyIterator$1.run(ServiceLoader.java:395) ~[?:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:398) ~[?:?]
	at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474) ~[?:?]
	at javax.xml.parsers.$FactoryFinder.lambda$findServiceProvider$3($FactoryFinder.java:205) ~[?:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at javax.xml.parsers.$FactoryFinder.findServiceProvider($FactoryFinder.java:197) ~[?:?]
	at javax.xml.parsers.$FactoryFinder.find($FactoryFinder.java:180) ~[?:?]
	at javax.xml.parsers.$FactoryFinder.find($FactoryFinder.java:122) ~[?:?]
	at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:41) ~[?:?]
	at org.openhab.binding.bom.internal.BomHandler.refreshObservation(BomHandler.java:125) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:?]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:?]
	at java.lang.Thread.run(Thread.java:748) ~[?:?]
Caused by: java.io.FileNotFoundException: /volume1/public/openHAB/userdata/cache/org.eclipse.osgi/276/0/bundleFile (No such file or directory)
	at java.util.zip.ZipFile.open(Native Method) ~[?:?]
	at java.util.zip.ZipFile.<init>(ZipFile.java:225) ~[?:?]
	at java.util.zip.ZipFile.<init>(ZipFile.java:155) ~[?:?]
	at java.util.zip.ZipFile.<init>(ZipFile.java:169) ~[?:?]
	at org.eclipse.osgi.framework.util.SecureAction$16.run(SecureAction.java:308) ~[?:?]
	at org.eclipse.osgi.framework.util.SecureAction$16.run(SecureAction.java:1) ~[?:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:306) ~[?:?]
	... 33 more
2019-04-14 12:29:11.057 [INFO ] [org.openhab.binding.bom             ] - FrameworkEvent INFO - org.openhab.binding.bom
java.io.IOException: Exception in opening zip file: /volume1/public/openHAB/userdata/cache/org.eclipse.osgi/276/0/bundleFile
	at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:321) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.basicOpen(ZipBundleFile.java:93) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.getZipFile(ZipBundleFile.java:106) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.checkedOpen(ZipBundleFile.java:65) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.ZipBundleFile.getEntry(ZipBundleFile.java:240) ~[?:?]
	at org.eclipse.osgi.storage.bundlefile.BundleFile.getResourceURL(BundleFile.java:136) ~[?:?]
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findResourceImpl(ClasspathManager.java:418) ~[?:?]
	at org.eclipse.osgi.internal.loader.classpath.ClasspathManager.findLocalResources(ClasspathManager.java:395) ~[?:?]
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.findLocalResources(ModuleClassLoader.java:324) ~[?:?]
	at org.eclipse.osgi.internal.loader.BundleLoader.findLocalResources(BundleLoader.java:860) ~[?:?]
	at org.eclipse.osgi.internal.loader.BundleLoader.findResources(BundleLoader.java:716) ~[?:?]
	at org.eclipse.osgi.internal.loader.ModuleClassLoader.getResources(ModuleClassLoader.java:234) ~[?:?]
	at org.eclipse.osgi.internal.framework.ContextFinder.getResources(ContextFinder.java:165) ~[?:?]
	at java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:348) ~[?:?]
	at java.util.ServiceLoader$LazyIterator.access$600(ServiceLoader.java:323) ~[?:?]
	at java.util.ServiceLoader$LazyIterator$1.run(ServiceLoader.java:396) ~[?:?]
	at java.util.ServiceLoader$LazyIterator$1.run(ServiceLoader.java:395) ~[?:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:398) ~[?:?]
	at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474) ~[?:?]
	at javax.xml.xpath.$XPathFactoryFinder$2.run($XPathFactoryFinder.java:293) ~[?:?]
	at javax.xml.xpath.$XPathFactoryFinder$2.run($XPathFactoryFinder.java:289) ~[?:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at javax.xml.xpath.$XPathFactoryFinder.findServiceProvider($XPathFactoryFinder.java:289) ~[?:?]
	at javax.xml.xpath.$XPathFactoryFinder._newFactory($XPathFactoryFinder.java:149) ~[?:?]
	at javax.xml.xpath.$XPathFactoryFinder.newFactory($XPathFactoryFinder.java:84) ~[?:?]
	at javax.xml.xpath.XPathFactory.newInstance(XPathFactory.java:69) ~[?:?]
	at javax.xml.xpath.XPathFactory.newInstance(XPathFactory.java:45) ~[?:?]
	at org.openhab.binding.bom.internal.BomHandler.refreshObservation(BomHandler.java:128) ~[?:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:?]
	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:?]
	at java.lang.Thread.run(Thread.java:748) ~[?:?]
Caused by: java.io.FileNotFoundException: /volume1/public/openHAB/userdata/cache/org.eclipse.osgi/276/0/bundleFile (No such file or directory)
	at java.util.zip.ZipFile.open(Native Method) ~[?:?]
	at java.util.zip.ZipFile.<init>(ZipFile.java:225) ~[?:?]
	at java.util.zip.ZipFile.<init>(ZipFile.java:155) ~[?:?]
	at java.util.zip.ZipFile.<init>(ZipFile.java:169) ~[?:?]
	at org.eclipse.osgi.framework.util.SecureAction$16.run(SecureAction.java:308) ~[?:?]
	at org.eclipse.osgi.framework.util.SecureAction$16.run(SecureAction.java:1) ~[?:?]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
	at org.eclipse.osgi.framework.util.SecureAction.getZipFile(SecureAction.java:306) ~[?:?]
	... 35 more

Running 2.4 on Synology NAS. Any suggestions?

I received a similar error when I manually copied a .jar to the add-on folder

@Lukie

Thanks, but I installed through paperui bindings marketplace…

No probs, it comes in three parts, the script, the radar config and the satellite config. Oh and the crontab entries. Also need iimagemagick installed for the image stuff.

Script:

#!/bin/bash

# 2DO
# -


# Read in Configuration File, bail if not possible.
if [[ -f $1 ]];then
        source $1
else
        echo " Must specify the Configuration file on commandline using"
        echo " the full path (eg: /home/XXXXX/.bin/bomRadarAnim.cfg) !!!"
        exit 1
fi

# Change to Working Directory.
here="$(pwd)"
cd ${baseDir}/${stillDir}

############ BEGIN COMPOUND VARS ############
# Get time from 'timeVector's secs ago.
ts=$(($(date +%s)-timeVector))

# Convert it to timestamp format dd-mm-yyyy hh:mm.
timeStamp=$(date -d @${ts} '+%d-%m-%Y %H:%M')

# Convert it to file timestamp format yyyymmdd_hhmm.
fileTimeStamp=$(date -d @${ts} '+%Y%m%d_%H%M')

# Setup Filenames.
outFile="${animPrefix}_${fileTimeStamp}.gif"
inFile="${stillPrefix}_${fileTimeStamp}.${stillFormat}"

# Massage Timestamp Locations to 'Convert' args.
tsLocation="+${timeStampLocX}+${timeStampLocY}"

# Calculate Images needed for Animation.
animLength=$((${animLength}*${imagesPerHour}+1))

# Generate 'Convert' Location args.
circleArgs="${locationX},${locationY} ${locationX},$((locationY+locationRadius))"
############# END COMPOUND VARS #############

################ BEGIN WORK ################
# Download and Timestamp File, Exit on Fail ...
# Get MD5sum of Previous File.
prevFile=$(ls -r|head -1); prevMD5=$(md5sum -b ${prevFile}|cut -d ' ' -f1)
# Download
wget -t10 -O ${inFile} ${stillSource} >/dev/null 2>&1
# Get MD5sum of Downloaded File.
currMD5=$(md5sum -b ${inFile}|cut -d ' ' -f1)
# Check whether File exists, is > zero bytes or isn't same as previous.
if [[ ! -s ${inFile} || ${currMD5} = ${prevMD5} ]];then
#       Must not exist, is zero bytes or is same as previous, delete it.
        rm -f ${inFile}
#       No file to work with, raise an Error and BAILOUT !
        echo " Download of ${inFile} Failed !!!"
        if [[ ${currMD5} = ${prevMD5} ]];then echo " Identical to Last File.";fi
        exit 1
fi

# Crop if Needed.
if [[ -n ${cropXY} ]];then
        convert ${inFile} -crop ${cropXY} +repage -layers Optimize ${inFile}
fi

# Place Timestamp and Location on Image.
convert ${inFile} -fill ${timeStampColor} -font ${timeStampFont} -pointsize ${timeStampFontSize} -annotate ${tsLocation} "${timeStamp}" +repage -layers Optimize -strip -quality ${imgQual} ${inFile}
convert ${inFile} -fill ${locationColor} -stroke ${locationColor} -draw "circle ${circleArgs}" +repage -layers Optimize ${inFile}

# Buld Animation.
animStills="$(ls -r|head -${animLength}|sort)"
convert -delay ${animDelay} -loop 0 ${animStills} -layers Optimize ${baseDir}/${animDir}/${outFile}

# Create Generic Link to Latest Anim
cd ${baseDir}
ln -f -s ${animDir}/${outFile} ${animPrefix}.gif

# Houskeeping
numStills2Del=$(($(ls ${stillDir} -1|wc -l)-(24*stillKeepDays*imagesPerHour+1)))
numAnims2Del=$(($(ls ${animDir} -1|wc -l)-(24*animKeepDays*imagesPerHour+1)))
if (( ${numStills2Del} > 0 )); then rm -f $(ls ${stillDir}/*|head -${numStills2Del}); fi
if (( ${numAnims2Del} > 0 )); then rm -f $(ls ${animDir}/*|head -${numAnims2Del}); fi

cd ${here}
################# END WORK #################

# BASIC LOGIC
# start in stills dir
# dl/ts
# crop ?
# add ts/loc to img
# create anim automagically in ../anims dir
# cd to baseDir
# force create link to anim
# housekeeping

Radar config

# Radar Images
# - maked in 10min intervals
# - produced 2 or 3 mins after time
# - save on the 5min marks and subract 5mins.
# http://www.bom.gov.au/radar/IDR223.gif
#
# Satellite Images
# - marked 1hr intervals at 32 past each hour
# - produced at 15min (approx) past each following hour (43mins after their timestamp)
# - save at 22min past each hour mark and subract 50mins (3000secs).
# http://www.bom.gov.au/gms/IDE00135.jpg
#
# Set cron at 10min intervals on the 5min mark.
############## BEGIN DEFAULTS ##############
baseDir='/mnt/data/www/weewx/radarImages'
#baseDir='/mnt/data/www/weewx/radarImages-test'
stillSource="http://www.bom.gov.au/radar/IDR223.gif"

# Format of Still images (used in some file masking ops).
stillFormat='gif'

# Prefix for downloaded Still images, used with Timestamp
# and Format ('stillPrefix'_'timeStamp'.'stillFormat')
# to create unique filenames.
stillPrefix='bomMackayRadar'

# Prefix for composed GIF Anims, used with Timestamp and Format
# ('animPrefix'_'timeStamp'.'gif') to create unique filenames.
animPrefix='radarLoop'

# SubDir of 'baseDir' to store Stills in.
stillDir='stills'

# SubDir of 'baseDir' to store Anims in.
animDir='anims'

# Anim Loop length to generate in Hours, for me 2hrs is only
# 13 images (2*6+1), so only 12 secs long final anim.
animLength='2'

# Delay between Frames in Hundreths (1/100) of a Second.
animDelay='100'

# How many Still Images downloaded, and Anims generated per Hour,
# this will need to be synced with your cron job, it's
# used in some calcs, so placed here for adjustability.
imagesPerHour='6'

# Time Difference (in seconds) between image generation,
# and the download. The final result resolution is
# in minutes, so there is leaway built-in. Using
# seconds because it makes the math much easier.
timeVector='300'

# Anims Archive Length in Days.
animKeepDays='1'

# Stills Archive Length in Days.
stillKeepDays='2'

# Image Quality.
imgQual='75'

# Timestamp X position in Pixels (image origin = top left).
timeStampLocX='299'

# Timestamp Y position in Pixels.
timeStampLocY='34'

# Timestamp Font.
timeStampFont='Helvetica-Bold'

# Timestamp Font Size.
timeStampFontSize='20'

# Timestamp Colour.
timeStampColor='darkgreen'

# Location Hilight X position in Pixels.
locationX='254'

# Location Hilight Y position in Pixels.
locationY='320'

# Radius of Location Hilight in Pixels.
locationRadius='4'

# Location Hilight Colour.
locationColor='darkred'

# Crop image (Xsize)x(Ysize)+(Xoffset)+(Yoffset),
# leave blank ('') for no cropping.
cropXY='512x552+6+6'
############### END DEFAULTS ###############

Satellite Config:

# Radar Images
# - maked in 10min intervals
# - produced 2 or 3 mins after time
# - save on the 5min marks and subract 5mins.
# http://www.bom.gov.au/radar/IDR223.gif
#
# Satellite Images
# - marked 1hr intervals at 32 past each hour
# - produced at 15min (approx) past each following hour (43mins after their timestamp)
# - save at 22min past each hour mark and subract 50mins (3000secs).
# http://www.bom.gov.au/gms/IDE00135.jpg
#
# Set cron at 1hr intervals on the 22min mark.
############## BEGIN DEFAULTS ##############
baseDir='/mnt/data/www/weewx/satelliteImages'
#baseDir='/mnt/data/www/weewx/satelliteImages-test'
stillSource="http://www.bom.gov.au/gms/IDE00135.jpg"

# Format of Still images (used in some file masking ops).
stillFormat='jpg'

# Prefix for downloaded Still images, used with Timestamp
# and Format ('stillPrefix'_'timeStamp'.'stillFormat')
# to create unique filenames.
stillPrefix='bomMackaySatellite'

# Prefix for composed GIF Anims, used with Timestamp and Format
# ('animPrefix'_'timeStamp'.'gif') to create unique filenames.
animPrefix='satelliteLoop'

# SubDir of 'baseDir' to store Stills in.
stillDir='stills'

# SubDir of 'baseDir' to store Anims in.
animDir='anims'

# Anim Loop length to generate in Hours, for me 24hrs is only
# 25 images (24*1+1), so only 12 secs long final anim.
animLength='24'

# Delay between Frames in Hundreths (1/100) of a Second.
animDelay='50'

# How many Still Images downloaded, and Anims generated per Hour,
# this will need to be synced with your cron job, it's
# used in some calcs, so placed here for adjustability.
imagesPerHour='1'

# Time Difference (in seconds) between image generation,
# and the download. The final result resolution is
# in minutes, so there is leaway built-in. Using
# seconds because it makes the math much easier.
timeVector='3000'

# Anims Archive Length in Days.
animKeepDays='3'

# Stills Archive Length in Days.
stillKeepDays='6'

# Image Quality.
imgQual='75'

#588 x 470
# Timestamp X position in Pixels (image origin = top left).
timeStampLocX='410'

# Timestamp Y position in Pixels.
timeStampLocY='444'

# Timestamp Font.
timeStampFont='Helvetica-Bold'

# Timestamp Font Size.
timeStampFontSize='20'

# Timestamp Colour.
timeStampColor='wheat'

# Location Hilight X position in Pixels.
locationX='442'

# Location Hilight Y position in Pixels.
locationY='176'

# Radius of Location Hilight in Pixels.
locationRadius='4'

# Location Hilight Colour.
locationColor='wheat'

# Crop image (Xsize)x(Ysize)+(Xoffset)+(Yoffset),
# leave blank ('') for no cropping.
cropXY=''
############### END DEFAULTS ###############

Crontab:

# BOM Radar Looper
5,15,25,35,45,55 * * * *        /home/XXXX/.bin/bomAnimGenerator.sh /home/XXXXX/.bin/bomRadarAnim.cfg

# BOM Satellite Looper
22 * * * *      /home/XXXXX/.bin/bomAnimGenerator.sh /home/XXXXX/.bin/bomSatelliteAnim.cfg
1 Like

That’s pretty cool… I didn’t realise you could handle all that in a few lines of shell script! My code is at least 1200 lines!

1 Like

Hi @marklavercombe,

Please try the following in order if you haven’t already:

  1. Delete BOM Thing.
  2. Uninstall binding.
  3. Shutdown openHAB: openhab-cli stop. I’m not sure if this is the same under Synology.
  4. Clean openHAB: cache openhab-cli clean-cache.
  5. Start openHAB: openhab-cli start.
  6. Install binding.

Regards,
Tom

Thanks muchly Tom, really appreciate it. It’s been running now for well over 4yrs without a hitch.

@tomitan

Hi Thomas. I there any way to retrieve the rainfall range forecast?
ie. 1-4mm for example…

Hi Mark,

Yes, I included the rainfall range a while back. It is available via two channels: minimum precipitation and maximum precipitation.

Cheers,
Tom

Thanks Tom, I seem to have missed that :wink:

Hi @tomitan has anyone verified the retain min and max setting works?

I have updated and can see this option but it is not showing in the sitemap

It also seems that other things (at least in Adelaide) dissapear as well. UV isnt there for day1 but is for day2.

the date and time for observation and forecast seem to never populate either.

Another strange thing is that day 2 and on are hotter max temps than BOM is saying (by a good 6-8 degrees) - perhaps something to do with the retaining?

Any ideas?

@tomitan do you have the Matrix widget that works with your Binding and Items file you can share?

Does anyone know if this MONSTER error, lol, is caused by this binding?


05:48:25.554 [ERROR] [.xtext.validation.CompositeEValidator] - Error executing EValidator
java.util.ConcurrentModificationException: null
        at org.eclipse.emf.common.util.AbstractEList$EIterator.checkModCount(AbstractEList.java:758) ~[?:?]
        at org.eclipse.emf.common.util.AbstractEList$EIterator.doNext(AbstractEList.java:712) ~[?:?]
        at org.eclipse.emf.common.util.AbstractEList$EIterator.next(AbstractEList.java:692) ~[?:?]
        at org.eclipse.emf.common.util.AbstractTreeIterator.next(AbstractTreeIterator.java:133) ~[?:?]
        at org.eclipse.xtext.resource.impl.DefaultResourceDescription.computeExportedObjects(DefaultResourceDescription.java:88) ~[?:?]
        at org.eclipse.xtext.resource.DerivedStateAwareResourceDescriptionManager$1.getLookUp(DerivedStateAwareResourceDescriptionManager.java:84) ~[?:?]
        at org.eclipse.xtext.resource.impl.AbstractResourceDescription.getExportedObjects(AbstractResourceDescription.java:50) ~[?:?]
        at org.eclipse.xtext.resource.impl.AbstractCompoundSelectable$4.apply(AbstractCompoundSelectable.java:75) ~[?:?]
        at org.eclipse.xtext.resource.impl.AbstractCompoundSelectable$4.apply(AbstractCompoundSelectable.java:71) ~[?:?]
        at com.google.common.collect.Iterators$8.transform(Iterators.java:799) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.Iterators$5.hasNext(Iterators.java:548) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.TransformedIterator.hasNext(TransformedIterator.java:43) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.Iterators.addAll(Iterators.java:361) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.Iterables.addAll(Iterables.java:354) ~[22:com.google.guava:18.0.0]
        at com.google.common.collect.Sets.newLinkedHashSet(Sets.java:328) ~[22:com.google.guava:18.0.0]
        at org.eclipse.xtext.xbase.lib.IterableExtensions.toSet(IterableExtensions.java:619) ~[160:org.eclipse.xtext.xbase.lib:2.14.0.v20180522-1629]
        at org.eclipse.xtext.xbase.validation.UniqueClassNameValidator.checkUniqueInIndex(UniqueClassNameValidator.java:102) ~[?:?]
        at org.eclipse.xtext.xbase.validation.UniqueClassNameValidator.doCheckUniqueName(UniqueClassNameValidator.java:95) ~[?:?]
        at org.eclipse.xtext.xbase.validation.UniqueClassNameValidator.doCheckUniqueName(UniqueClassNameValidator.java:87) ~[?:?]
        at org.eclipse.xtext.xbase.validation.UniqueClassNameValidator.lambda$checkUniqueName$0(UniqueClassNameValidator.java:74) ~[?:?]
        at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
        at org.eclipse.xtext.xbase.validation.UniqueClassNameValidator.checkUniqueName(UniqueClassNameValidator.java:76) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
        at org.eclipse.xtext.validation.AbstractDeclarativeValidator$MethodWrapper.invoke(AbstractDeclarativeValidator.java:118) ~[154:org.eclipse.xtext:2.14.0.v20180522-1821]
        at org.eclipse.xtext.validation.AbstractDeclarativeValidator.internalValidate(AbstractDeclarativeValidator.java:312) ~[154:org.eclipse.xtext:2.14.0.v20180522-1821]
        at org.eclipse.xtext.validation.AbstractInjectableValidator.validate(AbstractInjectableValidator.java:71) ~[154:org.eclipse.xtext:2.14.0.v20180522-1821]
        at org.eclipse.xtext.validation.CompositeEValidator.validate(CompositeEValidator.java:151) [154:org.eclipse.xtext:2.14.0.v20180522-1821]
        at org.eclipse.emf.ecore.util.Diagnostician.doValidate(Diagnostician.java:171) [66:org.eclipse.emf.ecore:2.12.0.v20160420-0247]
        at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:158) [66:org.eclipse.emf.ecore:2.12.0.v20160420-0247]
        at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:137) [66:org.eclipse.emf.ecore:2.12.0.v20160420-0247]
        at org.eclipse.emf.ecore.util.Diagnostician.validate(Diagnostician.java:108) [66:org.eclipse.emf.ecore:2.12.0.v20160420-0247]
        at org.eclipse.smarthome.model.core.internal.ModelRepositoryImpl.validateModel(ModelRepositoryImpl.java:280) [128:org.eclipse.smarthome.model.core:0.10.0.oh240]
        at org.eclipse.smarthome.model.core.internal.ModelRepositoryImpl.addOrRefreshModel(ModelRepositoryImpl.java:93) [128:org.eclipse.smarthome.model.core:0.10.0.oh240]
        at org.eclipse.smarthome.model.core.internal.folder.FolderObserver.checkFile(FolderObserver.java:227) [128:org.eclipse.smarthome.model.core:0.10.0.oh240]
        at org.eclipse.smarthome.model.core.internal.folder.FolderObserver.processIgnoredFiles(FolderObserver.java:137) [128:org.eclipse.smarthome.model.core:0.10.0.oh240]
        at org.eclipse.smarthome.model.core.internal.folder.FolderObserver.addModelParser(FolderObserver.java:85) [128:org.eclipse.smarthome.model.core:0.10.0.oh240]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]
        at org.apache.felix.scr.impl.inject.methods.BaseMethod.invokeMethod(BaseMethod.java:228) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.inject.methods.BaseMethod.access$500(BaseMethod.java:41) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.inject.methods.BaseMethod$Resolved.invoke(BaseMethod.java:664) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.inject.methods.BaseMethod.invoke(BaseMethod.java:510) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.inject.methods.BindMethod.invoke(BindMethod.java:42) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.DependencyManager.doInvokeBindMethod(DependencyManager.java:1809) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:1784) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.SingleComponentManager.invokeBindMethod(SingleComponentManager.java:409) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.addedService(DependencyManager.java:333) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.addedService(DependencyManager.java:302) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1216) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1137) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:944) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:880) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1168) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:125) [39:org.apache.felix.scr:2.1.2]
        at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109) [?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:920) [?:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) [?:?]
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225) [?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:469) [?:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:891) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:877) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:128) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:944) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:727) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1053) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.addedService(DependencyManager.java:1007) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1216) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1137) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:944) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:880) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1168) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:125) [39:org.apache.felix.scr:2.1.2]
        at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:109) [?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:920) [?:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) [?:?]
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:862) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:801) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:127) [?:?]
        at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:225) [?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.registerService(BundleContextImpl.java:469) [?:?]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:891) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:877) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:128) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:944) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:727) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:661) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:427) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:665) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:339) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:381) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.Activator.access$200(Activator.java:49) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:263) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169) [39:org.apache.felix.scr:2.1.2]
        at org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49) [39:org.apache.felix.scr:2.1.2]
        at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482) [?:?]
        at org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415) [?:?]
        at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) [?:?]
        at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444) [?:?]
        at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:908) [?:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) [?:?]
        at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) [?:?]
        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:213) [?:?]
        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:120) [?:?]
        at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:112) [?:?]
        at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:168) [?:?]
        at org.eclipse.osgi.container.Module.publishEvent(Module.java:476) [?:?]
        at org.eclipse.osgi.container.Module.start(Module.java:467) [?:?]
        at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1634) [?:?]
        at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1614) [?:?]
        at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1585) [?:?]
        at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1528) [?:?]
        at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1) [?:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) [?:?]
        at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340) [?:?]

@tomitan
Hey Tom, I still can’t seem to find the option in my BOM thing.
This is what I see in the Bindings section in paperui:

market:binding-4491519 - 1.0

Is that the correct version?