Hop til indhold
  • 0

openHAB2 IHC binding


Pauli Anttila
 Share

Spørgsmål

Update 12.3.2019:

Binding has been merged to openHAB main repository and will available in 2.5 version. Before that, new version can be found from official openHAB snapshot builds.

Before official add-on documentation page is updated, binding documentation can found here.

 

NOTE. If you have used older beta versions of the binding, beware that there has been some breaking changes lately:

  • Controller address parameter is not anymore ip, but hostname
  • "-channel" suffix is removed from channel types. E.g. switch-channel is just switch.

 

###########################################################################################################################

 

Even openHAB 1 IHC binding has been rock solid for many years, I finally decided to port the binding to support openHAB 2 features.

Latest version: https://openhab.jfrog.io/openhab/libs-pullrequest-local/org/openhab/binding/org.openhab.binding.ihc/2.4.0-SNAPSHOT/

Documentation link

Some improvements / features:

  • By default, binding create channels automatically from project file (currently all dataline_inputs, dataline_outputs, airlink_inputs, airlink_outputs and resource_temperature).
  • Auto creation can be disabled, and channels can be created manually (then all resource id's are supported).
  • Support both Paper UI and thing files configuration.
  • Channels for basic controller information (state, SW and HW version, controller uptime, etc).
  • Trigger channels support (button short press, long press and extra long press).
  • Support multiple controllers (those who have e.g. two controllers environment).

 5b000b95160a8_ScreenShot2018-05-19at14_32_14.thumb.png.4093d93247a17cd4fc3d66307c895976.png

5b000ba2cc62b_ScreenShot2018-05-19at14_33_06.thumb.png.648edf0e40855577f58e973c448514b6.png

 

Link til kommentar
Del på andre sites

Recommended Posts

  • 0

Hi i'm new at Openhab. I have IHC controller v3 with firmware 3.3.9 and I installed Openhab 2.3.0 on my RPI3B+.

After that i installed  org.openhab.binding.ihc-2.4.0-SNAPSHOT.jar by copying the .jar file to the /usr/share/openhab2/addons folder with WinSCP.

The binding found my in and outputs automaticaly, and it seemed to work perfect.

I tried to manualy add channels from Paper UI. I tried to make a readonly channel to a Enum, and to a floating point number, but both failed. (they both just showed a "-")

Then i tried to change the binding to org.openhab.binding.ihc_2.4.0.201812081313.jar, but now the binding failed, and is ofline. "Status: OFFLINE Initializing communication to the IHC / ELKO controller"

Here underneath is a part of the log that shows that the bindings is added, but i can't figure out what fails.

 

Where did i fail? How do i get on?

 


 

2018-12-14 16:47:37.582 [.ItemChannelLinkAddedEvent] - Link 'ihc_controller_4211b1f3_input3692636-ihc:controller:4211b1f3:input3692636' has been added.

2018-12-14 16:47:37.656 [.ItemChannelLinkAddedEvent] - Link 'ihc_controller_4211b1f3_input3692892-ihc:controller:4211b1f3:input3692892' has been added.

2018-12-14 16:47:37.698 [.ItemChannelLinkAddedEvent] - Link 'ihc_controller_4211b1f3_input3693148-ihc:controller:4211b1f3:input3693148' has been added.

2018-12-14 16:47:37.740 [.ItemChannelLinkAddedEvent] - Link 'ihc_controller_4211b1f3_output3134813-ihc:controller:4211b1f3:output3134813' has been added.

2018-12-14 16:47:37.796 [.ItemChannelLinkAddedEvent] - Link 'ihc_controller_4211b1f3_output8491613-ihc:controller:4211b1f3:output8491613' has been added.

2018-12-14 16:47:37.838 [.ItemChannelLinkAddedEvent] - Link 'ihc_controller_4211b1f3_output9286238-ihc:controller:4211b1f3:output9286238' has been added.

2018-12-14 16:47:45.653 [me.event.ThingUpdatedEvent] - Thing 'ihc:controller:4211b1f3' has been updated.

==> /var/log/openhab2/openhab.log <==

2018-12-14 16:47:46.002 [WARN ] [mmon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception

java.time.format.DateTimeParseException: Text '2017/34' could not be parsed at index 4

at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) ~[?:?]

at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) ~[?:?]

at java.time.ZonedDateTime.parse(ZonedDateTime.java:597) ~[?:?]

at java.time.ZonedDateTime.parse(ZonedDateTime.java:582) ~[?:?]

at org.openhab.binding.ihc.internal.ws.datatypes.WSSystemInfo.parseXMLData(WSSystemInfo.java:238) ~[?:?]

at org.openhab.binding.ihc.internal.ws.services.IhcConfigurationService.getSystemInfo(IhcConfigurationService.java:39) ~[?:?]

at org.openhab.binding.ihc.internal.ws.IhcClient.getSystemInfo(IhcClient.java:234) ~[?:?]

at org.openhab.binding.ihc.internal.handler.IhcHandler.updateControllerProperties(IhcHandler.java:278) ~[?:?]

at org.openhab.binding.ihc.internal.handler.IhcHandler.connect(IhcHandler.java:513) ~[?:?]

at org.openhab.binding.ihc.internal.handler.IhcHandler.reconnectCheck(IhcHandler.java:785) ~[?:?]

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) [?:?]

2018-12-14 16:48:19.523 [ERROR] [ersey.server.ServerRuntime$Responder] - An I/O error has occurred while writing a response message entity to the container output stream.

org.glassfish.jersey.server.internal.process.MappableException: org.eclipse.jetty.io.EofException

at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:92) [170:org.glassfish.jersey.core.jersey-server:2.22.2]

at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.server.ServerRuntime$Responder.writeResponse(ServerRuntime.java:711) [170:org.glassfish.jersey.core.jersey-server:2.22.2]

at org.glassfish.jersey.server.ServerRuntime$Responder.processResponse(ServerRuntime.java:444) [170:org.glassfish.jersey.core.jersey-server:2.22.2]

at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:434) [170:org.glassfish.jersey.core.jersey-server:2.22.2]

at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:329) [170:org.glassfish.jersey.core.jersey-server:2.22.2]

at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.internal.Errors.process(Errors.java:315) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.internal.Errors.process(Errors.java:297) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.internal.Errors.process(Errors.java:267) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) [169:org.glassfish.jersey.core.jersey-common:2.22.2]

at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) [170:org.glassfish.jersey.core.jersey-server:2.22.2]

at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) [170:org.glassfish.jersey.core.jersey-s

 

 

 

Link til kommentar
Del på andre sites

  • 0

@candstand, problem seems to be that your controller doesn't send dateTime XML data type in system info data structure, but value  '2017/34 '. Which most probably is the year plus week number. Not sure if data structure on v3 controller has been changed. Could you enable trace level log to IHC binging and send them to me?

It's easier to do from Karaf console by command

log:set TRACE org.openhab.binding.ihc

See more details from https://www.openhab.org/docs/administration/console.html and https://www.openhab.org/docs/administration/logging.html

Link til kommentar
Del på andre sites

  • 0
4 timer siden, Pauli Anttila skrev:

@candstand, problem seems to be that your controller doesn't send dateTime XML data type in system info data structure, but value  '2017/34 '. Which most probably is the year plus week number. Not sure if data structure on v3 controller has been changed. Could you enable trace level log to IHC binging and send them to me?

It's easier to do from Karaf console by command


log:set TRACE org.openhab.binding.ihc

See more details from https://www.openhab.org/docs/administration/console.html and https://www.openhab.org/docs/administration/logging.html

I'm not sure i did it right, but here you get the file: "org.ops4j.pax.logging.cfg" from /var/lib/openhab2/etc

I have no Linux skills, and don't know how the log is made, but it seems that the logfile is timestamped only when i run the log:set trace command.

Is it the right file?

 

 

# Common pattern layout for appenders
#log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

# Root logger
log4j2.rootLogger.level = WARN
log4j2.rootLogger.appenderRefs = out, osgi
log4j2.rootLogger.appenderRef.out.ref = LOGFILE
log4j2.rootLogger.appenderRef.osgi.ref = OSGI

# Karaf Shell logger
log4j2.logger.shell.name = org.apache.karaf.shell.support
log4j2.logger.shell.level = OFF
log4j2.logger.shell.appenderRefs = stdout
log4j2.logger.shell.appenderRef.stdout.ref = STDOUT

# Security audit logger
log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit
log4j2.logger.audit.level = INFO
log4j2.logger.audit.additivity = false
log4j2.logger.audit.appenderRefs = audit
log4j2.logger.audit.appenderRef.audit.ref = AUDIT

# openHAB specific logger configuration

log4j2.logger.openhab.name = org.openhab
log4j2.logger.openhab.level = INFO

log4j2.logger.smarthome.name = org.eclipse.smarthome
log4j2.logger.smarthome.level = INFO

log4j2.logger.smarthomeItemStateEvent.name = smarthome.event.ItemStateEvent
log4j2.logger.smarthomeItemStateEvent.level = ERROR
log4j2.logger.smarthomeItemAddedEvent.name = smarthome.event.ItemAddedEvent
log4j2.logger.smarthomeItemAddedEvent.level = ERROR
log4j2.logger.smarthomeItemRemovedEvent.name = smarthome.event.ItemRemovedEvent
log4j2.logger.smarthomeItemRemovedEvent.level = ERROR
log4j2.logger.smarthomeThingStatusInfoEvent.name = smarthome.event.ThingStatusInfoEvent
log4j2.logger.smarthomeThingStatusInfoEvent.level = ERROR
log4j2.logger.smarthomeThingAddedEvent.name = smarthome.event.ThingAddedEvent
log4j2.logger.smarthomeThingAddedEvent.level = ERROR
log4j2.logger.smarthomeThingRemovedEvent.name = smarthome.event.ThingRemovedEvent
log4j2.logger.smarthomeThingRemovedEvent.level = ERROR
log4j2.logger.smarthomeInboxUpdatedEvent.name = smarthome.event.InboxUpdatedEvent
log4j2.logger.smarthomeInboxUpdatedEvent.level = ERROR

log4j2.logger.events.name = smarthome.event
log4j2.logger.events.level = INFO
log4j2.logger.events.additivity = false
log4j2.logger.events.appenderRefs = event
log4j2.logger.events.appenderRef.event.ref = EVENT
log4j2.logger.events.appenderRef.osgi.ref = OSGI

log4j2.logger.jupnp.name = org.jupnp
log4j2.logger.jupnp.level = ERROR

log4j2.logger.jmdns.name = javax.jmdns
log4j2.logger.jmdns.level = ERROR

# This suppresses all Maven download issues from the log when doing feature installations
# as we are logging errors ourselves in a nicer way anyhow.
log4j2.logger.paxurl.name = org.ops4j.pax.url.mvn.internal.AetherBasedResolver
log4j2.logger.paxurl.level = ERROR

# Filters known issues of pax-web (issue link to be added here).
# Can be removed once the issues are resolved in an upcoming version.
log4j2.logger.paxweb.name = org.ops4j.pax.web.pax-web-runtime
log4j2.logger.paxweb.level = OFF

# Filters known issues of lsp4j, see
# https://github.com/eclipse/smarthome/issues/4639
# https://github.com/eclipse/smarthome/issues/4629
# https://github.com/eclipse/smarthome/issues/4643
# Can be removed once the issues are resolved in an upcoming version.
log4j2.logger.lsp4j.name = org.eclipse.lsp4j
log4j2.logger.lsp4j.level = OFF

# Filters known issues of KarServiceImpl, see
# https://github.com/openhab/openhab-distro/issues/519#issuecomment-351944506
# Can be removed once the issues are resolved in an upcoming version.
log4j2.logger.karservice.name = org.apache.karaf.kar.internal.KarServiceImpl
log4j2.logger.karservice.level = ERROR


# Appenders configuration

# Console appender not used by default (see log4j2.rootLogger.appenderRefs)
log4j2.appender.console.type = Console
log4j2.appender.console.name = STDOUT
log4j2.appender.console.layout.type = PatternLayout
log4j2.appender.console.layout.pattern = %d{HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n

# Rolling file appender
log4j2.appender.out.type = RollingRandomAccessFile
log4j2.appender.out.name = LOGFILE
log4j2.appender.out.fileName = ${openhab.logdir}/openhab.log
log4j2.appender.out.filePattern = ${openhab.logdir}/openhab.log.%i
log4j2.appender.out.immediateFlush = true
log4j2.appender.out.append = true
log4j2.appender.out.layout.type = PatternLayout
log4j2.appender.out.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n
log4j2.appender.out.policies.type = Policies
log4j2.appender.out.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.out.policies.size.size = 16MB

# Event log appender
log4j2.appender.event.type = RollingRandomAccessFile
log4j2.appender.event.name = EVENT
log4j2.appender.event.fileName = ${openhab.logdir}/events.log
log4j2.appender.event.filePattern = ${openhab.logdir}/events.log.%i
log4j2.appender.event.immediateFlush = true
log4j2.appender.event.append = true
log4j2.appender.event.layout.type = PatternLayout
log4j2.appender.event.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-26.26c] - %m%n
log4j2.appender.event.policies.type = Policies
log4j2.appender.event.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.event.policies.size.size = 16MB

# Audit file appender
log4j2.appender.audit.type = RollingRandomAccessFile
log4j2.appender.audit.name = AUDIT
log4j2.appender.audit.fileName = ${openhab.logdir}/audit.log
log4j2.appender.audit.filePattern = ${openhab.logdir}/audit.log.%i
log4j2.appender.audit.append = true
log4j2.appender.audit.layout.type = PatternLayout
log4j2.appender.audit.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-36.36c] - %m%n
log4j2.appender.audit.policies.type = Policies
log4j2.appender.audit.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.audit.policies.size.size = 8MB

# OSGi appender
log4j2.appender.osgi.type = PaxOsgi
log4j2.appender.osgi.name = OSGI
log4j2.appender.osgi.filter = *
log4j2.logger.org_openhab_binding_ihc.level = TRACE
log4j2.logger.org_openhab_binding_ihc.name = org.openhab.binding.ihc

 

Link til kommentar
Del på andre sites

  • 0
10 hours ago, candstand said:

I'm not sure i did it right, but here you get the file: "org.ops4j.pax.logging.cfg" from /var/lib/openhab2/etc

I have no Linux skills, and don't know how the log is made, but it seems that the logfile is timestamped only when i run the log:set trace command.

Is it the right file?

Well, I don't need the log configuration file but the logs itself :) You should see now lot of logging from the binding (openhab.log) at least when you restart the openHAB or the IHC binding. 

Binding can be restarted from the karaf console by command

bundle:restart org.openhab.binding.ihc

Beware that in TRACE level, all SOAP message contents are printed as well, so your IHC controller password will be in the log in plain text format, so removed it from the log before send to me or posted the here on the forum.

You can later on disable trace level logging by command: 

log:set DEFAULT org.openhab.binding.ihc

 

Link til kommentar
Del på andre sites

  • 0

Sorry, I'm no Linux expert at all. But hopefully learning.

Deleted all other bindings, and restarted IHC/ELKO binding, and hope this is the log that explains what happens.

I believe that 2017/34 is the production date of the IHC controller.

Forgot to mention that the temperatures from the temperature-sensors didn't show the dot and  the digit after the dot. (with org.openhab.binding.ihc-2.4.0-SNAPSHOT )

 

Log 20181215_1514.txt

IHC_Adm.JPG

Link til kommentar
Del på andre sites

  • 0

@candstand, Could you try this version https://www.dropbox.com/s/dz0diiiw0jcd6mh/org.openhab.binding.ihc_2.4.0.201812151728.jar?dl=0

Production date variable data type has been changed from dateTime to String in v3 software. I tried to fix that. Could you still keep trace level logs and send them to me as I very interested to see if there are any other changes.

Link til kommentar
Del på andre sites

  • 0
57 minutter siden, Pauli Anttila skrev:

@candstand, Could you try this version https://www.dropbox.com/s/dz0diiiw0jcd6mh/org.openhab.binding.ihc_2.4.0.201812151728.jar?dl=0

Production date variable data type has been changed from dateTime to String in v3 software. I tried to fix that. Could you still keep trace level logs and send them to me as I very interested to see if there are any other changes.

Paul also note that most int values are no longer returned as is but is string as far as i recall. I will try and write a bit more on my findings ASAP to share with you on your project

Link til kommentar
Del på andre sites

  • 0

Hi,

I am running openhab from windows-pc & IHC V2 HW6.2, and I would really love to be able to combine Openhab with IHC but I have some problems with the addon.

I have tried to use the "org.openhab.binding.ihc_2.4.0.201812081313.jar".

I have defined connection to my IHC in things file and added one dimmer in the items(to test it).

If i start Openhab with the dimmer in "items" openhab keeps connecting/disconnecting to IHC, and the dimmer doesn't work.

if I start Openhab without anything in "items" file and ad the dimmer while openhab is running, everything work perfectly. Somehow there seem to be something wrong with the startup. Is there some fix I can apply ?

 

Link til kommentar
Del på andre sites

  • 0
7 minutter siden, Pauli Anttila skrev:

@veng, it pretty impossible to help or comment without logs. Could you enable trace level logs? Could you also post your IHC related items and thing file?

Hi, sorry should have attached from beginning but kinda hopped someone else had the problems :)
 

"IHC.Items" = Dimmer   Stue_Dimmer       "Stue"           <light>        (GFStue)        ["Lighting"]   {channel="ihc:controller:ihc:Stuelys"}

"IHC.things" = ihc:controller:ihc [ ip="192.168.1.30", username="admin", password="X_X", timeout=5000, loadProjectFile=true, createChannelsAutomatically=false ] {
    Channels:
    Type dimmer-channel  : Stuelys       "Pare (stue)"    [ resourceId=76125 ]
}

logfiles v2 = boot with both files as above

logfiles v1 = boot with items files with "//" in front of line and the remove "//" when Openhab is running.

 

events1.log

events2.log

openhab1.log

openhab2.log

Link til kommentar
Del på andre sites

  • 0

@veng, you seems that have some kind of openhab cache problem as you already have ihc binding installed.

org.osgi.framework.BundleException: Could not resolve module: org.openhab.binding.ihc [223]
  Another singleton bundle selected: osgi.identity; type="osgi.bundle"; version:Version="2.4.0.201810011706"; osgi.identity="org.openhab.binding.ihc"; singleton:="true"

You should stop openhab and clear caches. Not sure how to do that on windows environment, but I guess there is cache and tmp folder somewhere. You can also search from openHAB forum how to clear caches in windows environment.

Link til kommentar
Del på andre sites

  • 0
4 timer siden, Pauli Anttila skrev:

@veng, you seems that have some kind of openhab cache problem as you already have ihc binding installed.


org.osgi.framework.BundleException: Could not resolve module: org.openhab.binding.ihc [223]
  Another singleton bundle selected: osgi.identity; type="osgi.bundle"; version:Version="2.4.0.201810011706"; osgi.identity="org.openhab.binding.ihc"; singleton:="true"

You should stop openhab and clear caches. Not sure how to do that on windows environment, but I guess there is cache and tmp folder somewhere. You can also search from openHAB forum how to clear caches in windows environment.

Hi, I have deleted tmp & cache folder and started openhab again. Seen from my point of view it behaves the same. Log attached, maybe you can see something usefull ?
Thanks for trying to help btw! :)

openhab.log

events.log

@Pauli Anttila (edit after logs upload) I read a bit in the logs and found several timeouts. I tested now with timeout = 15000 (ms) and that seemed to fix it. I have started openhab twice without problems. Maybe 15000ms si a bit much but was just to test if the was the problem :)

Link til kommentar
Del på andre sites

  • 0

@veng, that's great.

Even it now works, could you rerun following version in your environment with default 5000ms timeout. I improved the logging and I like to see why timeout occurs before 5000ms in your environment.

https://www.dropbox.com/s/zu9946e6j6b84c6/org.openhab.binding.ihc_2.4.0.201812182121.jar?dl=0

 

Link til kommentar
Del på andre sites

  • 0
På 18/12/2018 at 20:24 , Pauli Anttila skrev:

@veng, that's great.

Even it now works, could you rerun following version in your environment with default 5000ms timeout. I improved the logging and I like to see why timeout occurs before 5000ms in your environment.

 https://www.dropbox.com/s/zu9946e6j6b84c6/org.openhab.binding.ihc_2.4.0.201812182121.jar?dl=0

 

@Pauli Anttila

Just tested your new binding with 5000ms and it makes the same error as the other version. Let me know if you need more testing.

openhab.log

Link til kommentar
Del på andre sites

  • 0
4 hours ago, Kandersen said:

Hi @Pauli Anttila

Just a small notice:
It seems like, when creating a channel manually, one cant use dansih letters æ,ø,å in ChannelID. When trying, there will be a conflict error. 

That's a openHAB (more specifically in Eclipse SmartHome) framework limitation/issue. Same applies to all bindings (things id's or channel id's). Most probably special character aren't supported, but then e.g. PaperUI or Visual Code Studio via Language Server Protocol service in openHAB should give a warning. You could create issue on eclipse SmartHome about this.

Link til kommentar
Del på andre sites

Join the conversation

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

Gæst
Svar på dette spørgsmål

×   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.

Loader...
 Share

×
×
  • Tilføj...

Important Information

Privatlivspolitik og We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.

1200x630bb.png

ok