openHAB 4.2 Release Discussion

This topic can be used to discuss problems/experiences/questions on the openHAB 4.2 release as announced in this topic .

I now realize my issue (OpenHAB suddenly down?) was probably because of my upgrade to 4.2.0…

Do you do automatic upgrades?
Reading your topic, it seems that you are were surprised to use openHAB 4.2.0 …

Indeed

Okay, not sure how many times it was already mentioned on this forum, but you should NOT do automated upgrades - I guess I don’t have to explain why. This not only applies for openHAB, but for other software packages as well - usually when doign any upgrade that is not a fix (according to semver, a fix only increases the third digit of the version number), the release notes should be checked out for breaking changes.

1 Like

Okay. When I update a Docker instance 4.1.3 to 4.2.0, the following errors appear in the start log.
The interface is then accessible, but all physical bindings are not available/activated. Installation via the store is also not possible.


openhab-1         | JSON database updated successfully.
openhab-1         | 
openhab-1         | 
openhab-1         | SUCCESS: openHAB updated from 4.1.3 to 4.2.0
openhab-1         | 
openhab-1         | + chown -R openhab:openhab /openhab
renderer-1        | {"collectDefaultMetrics":true,"level":"info","message":"Metrics enabled","requestDurationBuckets":"1,5,7,9,11,13,15,20,30"}
renderer-1        | {"level":"info","message":"HTTP Server started, listening at http://localhost:8081"}
grafana-1         | logger=grafana-apiserver t=2024-07-08T13:15:47.573802035+02:00 level=info msg="Adding GroupVersion playlist.grafana.app v0alpha1 to ResourceManager"
grafana-1         | logger=grafana-apiserver t=2024-07-08T13:15:47.575936637+02:00 level=info msg="Adding GroupVersion featuretoggle.grafana.app v0alpha1 to ResourceManager"
openhab-1         | + sync
openhab-1         | + '[' -d /etc/cont-init.d ']'
openhab-1         | + sync
openhab-1         | + '[' false == false ']'
openhab-1         | ++ IFS=' '
openhab-1         | ++ echo gosu openhab tini -s ./start.sh
openhab-1         | + '[' 'gosu openhab tini -s ./start.sh' == 'gosu openhab tini -s ./start.sh' ']'
openhab-1         | + command=($@ server)
openhab-1         | + exec gosu openhab tini -s ./start.sh server
openhab-1         | Launching the openHAB runtime...
frontail-openhab  | tail: /var/log/openhab/openhab.log has been replaced; following end of new file
frontail-openhab  | 
frontail-openhab  | tail: /var/log/openhab/events.log has been replaced; following end of new file
frontail-openhab  | 
grafana-1         | logger=rendering renderer=http t=2024-07-08T13:16:01.10118721+02:00 level=debug msg="calling remote rendering service" url=http://renderer:8081/render/version
grafana-1         | logger=rendering renderer=http t=2024-07-08T13:16:01.151116503+02:00 level=info msg="Backend rendering via external http server" version=3.11.0
openhab-1         | org.apache.karaf.features.internal.util.MultiException: Error:
openhab-1         | 	Error downloading mvn:org.apache.httpcomponents/httpcore-osgi/4.4.13
openhab-1         | 	Error downloading mvn:org.apache.httpcomponents/httpclient-osgi/4.5.13
openhab-1         | 	at org.apache.karaf.features.internal.download.impl.MavenDownloadManager$MavenDownloader.<init>(MavenDownloadManager.java:91)
openhab-1         | 	at org.apache.karaf.features.internal.download.impl.MavenDownloadManager.createDownloader(MavenDownloadManager.java:72)
openhab-1         | 	at org.apache.karaf.features.internal.region.Subsystem.downloadBundles(Subsystem.java:474)
openhab-1         | 	at org.apache.karaf.features.internal.region.Subsystem.downloadBundles(Subsystem.java:469)
openhab-1         | 	at org.apache.karaf.features.internal.region.SubsystemResolver.resolve(SubsystemResolver.java:223)
openhab-1         | 	at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:399)
openhab-1         | 	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1069)
openhab-1         | 	at org.apache.karaf.features.internal.service.FeaturesServiceImpl.lambda$doProvisionInThread$13(FeaturesServiceImpl.java:1004)
openhab-1         | 	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
openhab-1         | 	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
openhab-1         | 	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
openhab-1         | 	at java.base/java.lang.Thread.run(Thread.java:840)
openhab-1         | 	Suppressed: java.io.IOException: Error downloading mvn:org.apache.httpcomponents/httpcore-osgi/4.4.13
openhab-1         | 		at org.apache.karaf.features.internal.download.impl.AbstractRetryableDownloadTask.run(AbstractRetryableDownloadTask.java:77)
openhab-1         | 		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
openhab-1         | 		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
openhab-1         | 		at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
openhab-1         | 		... 3 more
openhab-1         | 	Caused by: java.io.IOException: Error resolving artifact org.apache.httpcomponents:httpcore-osgi:jar:4.4.13: [Could not find artifact org.apache.httpcomponents:httpcore-osgi:jar:4.4.13 in openhab (https://openhab.jfrog.io/openhab/libs-release/)]
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.configureIOException(AetherBasedResolver.java:803)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:774)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:657)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:598)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:565)
openhab-1         | 		at org.apache.karaf.features.internal.download.impl.MavenDownloadTask.download(MavenDownloadTask.java:52)
openhab-1         | 		at org.apache.karaf.features.internal.download.impl.AbstractRetryableDownloadTask.run(AbstractRetryableDownloadTask.java:60)
openhab-1         | 		... 6 more
openhab-1         | 		Suppressed: shaded.org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact org.apache.httpcomponents:httpcore-osgi:jar:4.4.13 in openhab (https://openhab.jfrog.io/openhab/libs-release/)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(ArtifactTransportListener.java:48)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:401)
openhab-1         | 			at shaded.org.eclipse.aether.util.concurrency.RunnableErrorForwarder.lambda$wrap$0(RunnableErrorForwarder.java:73)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(BasicRepositoryConnector.java:669)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:290)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:520)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:408)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:235)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:212)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:272)
openhab-1         | 			at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:767)
openhab-1         | 			... 11 more
openhab-1         | 	Caused by: shaded.org.eclipse.aether.resolution.ArtifactResolutionException: Error resolving artifact org.apache.httpcomponents:httpcore-osgi:jar:4.4.13
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:431)
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:235)
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:212)
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:272)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:767)
openhab-1         | 		... 11 more
openhab-1         | 	Suppressed: java.io.IOException: Error downloading mvn:org.apache.httpcomponents/httpclient-osgi/4.5.13
openhab-1         | 		at org.apache.karaf.features.internal.download.impl.AbstractRetryableDownloadTask.run(AbstractRetryableDownloadTask.java:77)
openhab-1         | 		at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
openhab-1         | 		at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
openhab-1         | 		at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
openhab-1         | 		... 3 more
openhab-1         | 	Caused by: java.io.IOException: Error resolving artifact org.apache.httpcomponents:httpclient-osgi:jar:4.5.13: [Could not find artifact org.apache.httpcomponents:httpclient-osgi:jar:4.5.13 in openhab (https://openhab.jfrog.io/openhab/libs-release/)]
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.configureIOException(AetherBasedResolver.java:803)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:774)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:657)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:598)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:565)
openhab-1         | 		at org.apache.karaf.features.internal.download.impl.MavenDownloadTask.download(MavenDownloadTask.java:52)
openhab-1         | 		at org.apache.karaf.features.internal.download.impl.AbstractRetryableDownloadTask.run(AbstractRetryableDownloadTask.java:60)
openhab-1         | 		... 6 more
openhab-1         | 		Suppressed: shaded.org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact org.apache.httpcomponents:httpclient-osgi:jar:4.5.13 in openhab (https://openhab.jfrog.io/openhab/libs-release/)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(ArtifactTransportListener.java:48)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:401)
openhab-1         | 			at shaded.org.eclipse.aether.util.concurrency.RunnableErrorForwarder.lambda$wrap$0(RunnableErrorForwarder.java:73)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector$DirectExecutor.execute(BasicRepositoryConnector.java:669)
openhab-1         | 			at shaded.org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:290)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:520)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:408)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:235)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:212)
openhab-1         | 			at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:272)
openhab-1         | 			at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:767)
openhab-1         | 			... 11 more
openhab-1         | 	Caused by: shaded.org.eclipse.aether.resolution.ArtifactResolutionException: Error resolving artifact org.apache.httpcomponents:httpclient-osgi:jar:4.5.13
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:431)
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:235)
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:212)
openhab-1         | 		at shaded.org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:272)
openhab-1         | 		at org.ops4j.pax.url.mvn.internal.AetherBasedResolver.resolve(AetherBasedResolver.java:767)
openhab-1         | 		... 11 more

Minor issue with the UI:

After I upgraded my openhab system with the 4.2 version, I found some problems when displaying the code of my sitemap:

An error message in red is mixed with the source code. In addition, I cannot scrolled the source code of the sitemap. I did the test with Firefox and Chrome: same issue.

Concerning the error: I do not know why I have this error now. I did not see it with the previous version.

I tried with another more simple sitemap (the one for my Apple Watch):

No error this time, but the 5 first lines of the JSON code is mixed with the source code of the sitemap.

Hej all…
Sitemap is displayed incorrectly with Firefox since the upgrade to 4.2, in Chrome it is displayed as before.

Firefox

Chrome

I have created a fix for that and will backport it to 4.2.x, so the next patch release will include it:

And BTW, it’s not XML, it’s JSON :wink:

Hi,

have a script which should run on start level 100 after items and things have been initialized. This worked with previous versions, but with 4.2 the script will be loaded when things are still initializing or even uninitialized

2024-07-08 20:59:08.939 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Schlafzimmer-LED' changed from INITIALIZING to OFFLINE
2024-07-08 20:59:08.943 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Schlafzimmer-LED' changed from OFFLINE to ONLINE
2024-07-08 20:59:08.953 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Schlafzimmer-Ventilator' changed from UNINITIALIZED to INITIALIZING
==> /var/log/openhab/openhab.log <==
2024-07-08 20:59:08.972 [INFO ] [ort.loader.AbstractScriptFileWatcher] - (Re-)Loading script '/etc/openhab/automation/jsr223/zonecontroller.sl100.groovy'
==> /var/log/openhab/events.log <==
2024-07-08 20:59:09.008 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Schlafzimmer-Ventilator' changed from INITIALIZING to ONLINE
2024-07-08 20:59:09.020 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Schlafzimmer-Heizung' changed from UNINITIALIZED to INITIALIZING
2024-07-08 20:59:09.050 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Schlafzimmer-Heizung' changed from INITIALIZING to ONLINE
2024-07-08 20:59:09.067 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Ankleide-Rolladen' changed from UNINITIALIZED to INITIALIZING
2024-07-08 20:59:09.083 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Ankleide-Rolladen' changed from INITIALIZING to ONLINE
2024-07-08 20:59:09.093 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:topic:Ankleide-Heizung' changed from UNINITIALIZED to INITIALIZING
2024-07-08 20:59:09.123 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'openweathermap:onecall:api:local' changed from UNKNOWN to ONLINE
2024-07-08 20:59:09.124 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'openweathermap:weather-api:api' changed from UNKNOWN to ONLINE

Also noticed that a script which should run on startlevel 20 gets loaded twice:

2024-07-08 20:58:49.433 [INFO ] [o.internal.handler.AstroThingHandler] - Scheduled Positional job astro:sun:local every 60 seconds
**2024-07-08 20:58:49.779 [INFO ] [ort.loader.AbstractScriptFileWatcher] - (Re-)Loading script '/etc/openhab/automation/jsr223/utils.openHAB.initialize.sl20.groovy'**
2024-07-08 20:58:50.025 [INFO ] [g.discovery.internal.PersistentInbox] - Added new thing 'openweathermap:onecall:api:local' to inbox.
2024-07-08 20:58:50.829 [INFO ] [e.automation.internal.RuleEngineImpl] - Rule engine started.
==> /var/log/openhab/events.log <==
2024-07-08 20:58:51.029 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'openweathermap:onecall:api:local' changed from UNINITIALIZED to INITIALIZING
2024-07-08 20:58:51.059 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'openweathermap:onecall:api:local' changed from INITIALIZING to UNKNOWN
2024-07-08 20:58:51.289 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Dietzenbach_Azimut' changed from 300.84150069902273 ° to 300.8476135342341 °
2024-07-08 20:58:51.308 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Dietzenbach_Elevation' changed from 3.9278065833215594 ° to 3.9232661274948875 °
2024-07-08 20:58:51.399 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'systeminfo:computer:Am_Rebstock_12' changed from INITIALIZING to ONLINE
2024-07-08 20:58:51.421 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'avmfritz:fritzbox:192_168_178_1' changed from UNINITIALIZED (NOT_YET_READY) to INITIALIZING
2024-07-08 20:58:51.443 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'avmfritz:fritzbox:192_168_178_1' changed from INITIALIZING to UNKNOWN
2024-07-08 20:58:51.449 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'FRITZBox_6660_Cable_Eingehender_Anruf' changed from NULL to UNDEF
2024-07-08 20:58:51.450 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'FRITZBox_6660_Cable_Ausgehender_Anruf' changed from NULL to UNDEF
==> /var/log/openhab/openhab.log <==
2024-07-08 20:58:51.498 [INFO ] [.transport.mqtt.MqttBrokerConnection] - Starting MQTT broker connection to 'localhost' with clientid OpenHAB
==> /var/log/openhab/events.log <==
2024-07-08 20:58:51.558 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'wifiled:wifiled:Sahira-LED' changed from INITIALIZING to OFFLINE (CONFIGURATION_ERROR): No route to host
2024-07-08 20:58:51.567 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'wifiled:wifiled:Selina-LED' changed from UNINITIALIZED to INITIALIZING
2024-07-08 20:58:51.729 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'mqtt:broker:mosquitto' changed from OFFLINE to ONLINE
2024-07-08 20:58:51.839 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'avmfritz:fritzbox:192_168_178_1' changed from UNKNOWN to ONLINE
2024-07-08 20:58:51.855 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'astro:moon:local' changed from UNINITIALIZED (NOT_YET_READY) to INITIALIZING
2024-07-08 20:58:51.859 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'astro:moon:local' changed from INITIALIZING to ONLINE
2024-07-08 20:58:53.230 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Selina_Anwesend' changed from NULL to ON
2024-07-08 20:58:54.661 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'wifiled:wifiled:Selina-LED' changed from INITIALIZING to OFFLINE (CONFIGURATION_ERROR): No route to host
2024-07-08 20:58:56.462 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Am_Rebstock_12_Heap' changed from NULL to 11 %
==> /var/log/openhab/openhab.log <==
**2024-07-08 20:58:57.519 [INFO ] [ort.loader.AbstractScriptFileWatcher] - (Re-)Loading script '/etc/openhab/automation/jsr223/utils.openHAB.initialize.sl20.groovy'**

I’ve noticed that the last line(s) of code in page editor are invisible. Is this related?

I don’t think this is related - anyway, I am already working on a fix :+1:

1 Like

In Rules

Item2.postUpdate(Item1.deltaSince(timestamp,“jdbc”).intValue + " Wh")

is not working anymore, gives a error:
‘intValue’ is not a member of 'org.openhab.core.types.State

Both items are QuantityType, in OH 4.1 it worked without any issues

Item2.postUpdate(Item1.deltaSince(timestamp,“jdbc”))

Thanks a lot
Also in items definition [JS(script.js):%s] is not working anymore. Javascript is enabled as addon and scripts are located in $OPENHAB_CONF/transform (same as with OH4.1)

any error logs?

Thanks for the fix and sorry for the confusion between XML and JSON… I was too fast writing the text…

1 Like

For Basic UI users, like after any OH upgrade, please do not forget to clear your browser cache.

2 Likes

Hi all,

I am going to the first update of openhab. I am going to update from 4.1.3 to 4.2. How can I do it properly?

Can I use the ssh cli update or download the zip and override the directory?

How can I take a full backup to recover?

Do I need to stop the server before updating or the update process will take care of it?

I am using it win 11 environment with Java 17.
Please share the link to the tutorial if already exists. I found many comments related to update from 3x to 4x.

1 Like