SmartHome How to create a recursive Timer in OpenHab3's DSL Rule

I wanted a DSL Script to send a notification email if a door was still opened after several checks.

There are various options to achieve this purpose.

A simple option could have been to use a Switch Item with an Expire Property. When the door opens, set that Switch Item to 'ON' and initialize a Number Item to be count how many checks will be done. When the Switch Item expires, execute a script which checks if the door is still opened. If it is not, that script ends. Otherwise, it increases the Item Number. If that Item Number is lower than the maximum checks to be done (your threshold), Set back the Switch Item to 'ON'. Otherwise, send the notification email.

Another option (just for fun) relies on a DSL Script with a lamdba expression which creates a Timer calling itself recursively until the door is closed or your threshold is reached. That DLS Script must be called when the Door opens.

Here after a Number Item SensorGarageDoor_Duration is used to count the number of checks: The Item SensorGarageDoor_OpenClose is the state of the Sensor on the Door.


val int treshold = 3
var int attempt = 0

// Define a Lambda Expression to check if the Door is open and if not, call itself after 15 minutes to check again until a treshold of calls is reached
val Functions$Function1 Monitor = [ Functions$Function1 recursive |
    if (SensorGarageDoor_OpenClose.state == OPEN) {
    logInfo("default.rules", "Monitor Opened Door")
    createTimerWithArgument(now.plusMinutes(15), recursive, [ Functions$Function1 callMonitor |
      var int duration = (SensorGarageDoor_Duration.state as Number).intValue+1
      SensorGarageDoor_Duration.sendCommand(duration)
      logInfo("default.rules", "Garage Opened since "+duration.toString+" cycle(s)")
      if (duration == treshold) {
          logInfo("default.rules", "Notify by email that Garage still Opened after "+duration.toString+" cycles")
          val mailActions = getActions("mail","your smtp binding")
          val success = mailActions.sendMail("your from", "your subject", "your message")
      } else if (duration < treshold) {
          callMonitor.apply(callMonitor)
      }
    ])
} else {
    logInfo("default.rules", "Stop monitoring Door")
}
true
] 

if (SensorGarageDoor_Duration.state != NULL) {
  attempt = (SensorGarageDoor_Duration.state as Number).intValue
} else {
  attempt = treshold
}

if (attempt < treshold) {
  logInfo("default.rules", "Request for monitoring Opened Door")
  SensorGarageDoor_Duration.sendCommand(0)
  Monitor.apply(Monitor)
} else {
  logInfo("default.rules", "New request for monitoring Opened Door ignored")  
}

One of the trick is to pass the Lambda Expression as parameter to the Timer (Created with createTimerWithArgument). Indeed, a Timer may not call a "Global" Lambda Expression. To get a Lambda Expression as parameter, this parameter must be defined as Functions$FunctionX (where X is the amount of parameters of the Lambda Expression). In my sample above, my Lambda as one parameter which is itself, to be passed to the Trigger (So, it is typed Functions$Function1).

You must type explicitly the parameters as Functions$Function1 to be able to use the method "apply()".

Raspberry Pi Xiamo Aqara and Openhab on Raspberry Pi

A few notes on using Xiaomi Aqara Sensors and Switches with Openhab 3.

Click to Read More

I am using a Zigbee USB key Conbee II from Dresen Eletronik.

It is plugged into the Raspberry Pi with a USB cable extension to put it away from the other keys used on this RPi, like my Sigma Z-Wave controller.

I am sing OpenHab 3 (previously OpenHab 2).

Opposite to the Sigma Z-Wave USB key, there is not mount issue after a reboot due to the usb port id increasing... (See also a solution in French).

I am using the Phoscon App to connect and manage devices via the Conbee II key. The App is accessible on the http port 80 of the Raspberry.

To connect a new Xiaomi Aqara device,

  1. "Add a Sensor" or a "Add a Switch" within Phoscon. Pick the type "Other".
  2. Press the reset button for 5 sec. The blue led should turn on and start blinking after 5 sec. Release the button immediately when it starts blinking. The led will then turn on for 2 or 3 sec and then blink 3 times. It means that the connection is established.
  3. A few second later, the device will appear in Phoscon.

To get the Things into Openhab, Add the Binding "Dresen Eletronik DeCONZ Binding" and "Scan" for devices.

I am using with success:

  • Multi Sensors : with values for Temperature, Humidity and Pressure
  • Door and Window Sensors: with Status Opened / Closed
  • A Cube : with events Pushed (various direction), Rotation, Shacked
  • Wireless Mini Switch : One Button Control with 4 events: Single Press, Double Press, Long Press and Long Press Release

 

Notice: 

  • after a few month using the Door Sensors on my Garage Door, it stopped to send events... The problem was that the captor part was attached on a metal upright which ended to be magnetized by the magnet part moving around...

Raspberry Pi USB ports used by openHab's Z-Wave Controller change after each reboot on RPI

Usually, USB keys get assigned a new port such as /dev/ttyACM0, /dev/ttyACM1, etc..., each time they are unplugged and replugged into the RPI or if the RPI reboots. A solution consists in making these ports permanent via symlinks.

Click to Read More

This "feature" is a problem as the specified device may not be recognized anymore by configured softwares, like the Z-Wave Binding or openHab.

See a definitive solution here: make serial USB ports persistent via symlinks.

SmartHome Easily Backup openHab into a Shared Folder

I am running openHab2 on my raspberry pi 4 using openhabian and I wanted to schedule a backup of my config into a shared folder of my Synology.

Backup as root

Openhabian's backup solution 'Amanda' didn't convince me to automate such a backup. So I wrote my own backup script and scheduled it with a cron job.

First, create a shared folder named "backups" on your Synology via Control Panel > Shared Folder > Create:

Next, create a user account named "backup" via Control Panel > User > Create:

Grant that account write access on the shared folder "backups" via Control Panel > User > backup > Edit > Read/Write

The Synology part being ready, move now to openhabian, on the RPI, using a ssh console (E.g.: Putty) to create and schedule the backup script. Most parts will have to be done as 'root' (to make it simpler... but no safer), so type;

sudo -i

If just like me you previously tried to configure the backup with Amanda, using the command "sudo openhabian-config" and then the menu 50 > 52, a mailer daemon (exim4) was probably installed and you want now to remove it... Check if it's running (not with the command "systemctl --type=service --state=running" but) with:

sudo service --status-all

If you see a + in front of exim4, disable and remove it

sudo systemctl stop exim4
sudo systemctl disable exim4
sudo apt-get remove exim4 exim4-base exim4-config exim4-daemon-light
sudo rm -r /var/log/exim4/

You can also next uninstall and remove Amanda

sudo apt remove amanda-client
sudo apt remove amanda-server
sudo rm -r /var/lib/amanda/
sudo rm -r /etc/amanda

Now, we can start with the preparation of the backup script. Define first a mount point on your RPI. E.g.: "/mnt/backups":

mkdir /mnt/backups

Define next the shared folder of your Synology by editing the fstab file:

sudo nano /etc/fstab 

Add the line here under in that file and save your change with CTRL-o, Enter, CTRL-x:

//<ip of your Synology>/backups /mnt/backups cifs username=backup,password=<password>,uid=1000,gid=1000,vers=3.0 0 0

Attention: the network is usually not yet available when the fstab file is used to mount the drives a boot time. So this shared folder will most probably not be mounted automatically!

Create a file:

nano /home/openhabian/maintenance.sh

with the backup script here under:

#!/bin/sh
# Backup Openhab of Synology
log="/var/log/maintenance.log"

echo $(date) "Run openhab maintenance: $0" >> $log

if mountpoint -q /mnt/backups
then
echo $(date) "Synology's backups share is mounted." >> $log
else
echo $(date) "Synology's backups share is not mounted. Try to mount as per fstab definition." >> $log
sudo mount /mnt/backups
sleep 3
if mountpoint -q /mnt/backups
then
echo $(date) "Synology's backups share is now successfully mounted." >> $log
else
echo $(date) "Synology's backups share cannot be mounted." >> $log
fi
fi

if mountpoint -q /mnt/backups
then
# Keep the 10 last backups
rm -f $(ls -1t /mnt/backups/Raspberry/openhab2-backup-* | tail -n +11)
cd $OPENHAB_HOME
sudo ./runtime/bin/backup /mnt/backups/Raspberry/openhab2-backup-"$(date +"%Y_%m_%d_%I_%M").zip" >> $log
echo $(date) "custom backups of openhab completed." >> $log
echo "-----------------------------------------------------------------" >> $log
fi
 

Make that script executable (for all users...)

sudo chmod a+x maintenance.sh

To run that script as root on a regular basis, you have to schedule it as root (using now sudo explicitly if you didn't type sudo -i earlier) via crontab:

sudo crontab -e

If it's the first time you run crontab, you will have to pick your prefered editor. I advice nano ;)

Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/mcedit
4. /usr/bin/vim.tiny
5. /bin/ed

Choose 1-5 [1]: 1

In crontab, add this at the end and ave that change with CTRL-o, Enter, CTRL-x:

0 1 * * * /home/openhabian/maintenance.sh

Notice: if you want to mount the shared drives at boot, which usually fails as mentioned previously as the network is not yet available when fstab is first called, you can add this in the crontab too:

@reboot sleep 300; mount -a

You can now try the script with:

sh /home/openhabian/maintenance.sh

If it works, it should also work when triggered by the cron job.

Backup as openhabian

To run scripts as root is usually not recommended. But the backup script of openhab may only be run as root... We could run it with the account 'openhab', but the backup files will belongs to the user 'openhabian', making the cleanup tricky. I you really don't want to run and schedule my script as root, then the best option is to run it with the account "openhabian":

Still being is root mode (sudo -i), create the log file manually and grant access for all users:

touch /var/log/maintenance.log
chmod a+rw /var/log/maintenance.log

 

Authorize the user "openhabian" to execute the backup script "/usr/share/openhab2/runtime/bin/backup". To do this, you have to create a file in the /etc/sudoers.d folder. All files in that folder are used by the "sudo" command to authorize configured users to execute specified commands as root, with or without password. You MUST ABSOLUTELY edit that file with the command "visudo". This one will check that your changes are valid. If you edit that file with another editor and it contains an error, you won't be able to use the "sudo" command anymore (you will have to plug the SD card into a USB adapter on another raspberry to fix the issue or to simply delete the invalid file. USB device are automatically mounted under /media/usbxxx if you installed the package usbmount).

visudo /etc/sudoers.d/openhab

In that file, add the line here under and save your change with CTRL-o, enter, CTRL-x

# Allow openhabian user to execute the backup script
openhabian ALL=(ALL) NOPASSWD: /bin/mount, /usr/share/openhab2/runtime/bin/backup

 

Unschedule the script from root's crontab (remove the line added with crontab -e)

crontab -e
0 1 * * * /home/openhabian/maintenance.sh

 

And schedule it now within openhab's crontab (has to be done as 'openhabian'  user)

sudo -u openhabian crontab -e

And add

0 1 * * * /home/openhabian/maintenance.sh

 

Et voilà.

 

PS.: If you experience issues when mounting the remote shared folder, try to mount it interactively (using an administration account of  your Synology or an account having a password without symbols such as %, # or !)

apt install smbclient 
smbclient //<remote ip>/<shared folder> -U <user account>

You can also check the latest messages from the kernel

dmesg | tail -n10

Raspberry Pi Install Java 8 SDK and OpenHab 2 on Raspberry Pi Desktop for RPI 4

I wanted to install OpenHab 2 on my RPI 4 which is running the latest Raspberry Pi Desktop. But I was missing Java 8 which is a prerequisite and unfortunately not available anymore as a stable version, for Debian 10, due to a security issue.

Click to Read More

First, here is the version of Raspberry Pi Desktop I have:

$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 10 (buster)"
NAME="Raspbian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

Trying to install Java 8 SDK was resulting in errors like:

$ sudo apt-get install openjdk-8-jdk
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package

Or like:

Reading package lists... Done
Building dependency tree
Reading state information... Done
Package openjdk-8-jdk is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
openjdk-8-jdk-headless
E: Package 'openjdk-8-jdk' has no installation candidate

My Package sources were:

deb http://ftp.debian.org/debian/ buster main contrib non-free
deb http://security.debian.org/ buster/updates main contrib non-free
deb http://ftp.debian.org/debian/ buster-updates main contrib non-free

The solution was to add a new source with the 'unstable' arm-hf packages in /etc/apt/sources.list.d/raspi.list ('sid' is the codename for unstable):

$ echo 'deb http://ftp.debian.org/debian sid main' | sudo tee -a /etc/apt/sources.list.d/

Next, do:

$ sudo apt-get update
$ sudo apt install gcc-8-base
$ sudo apt-get install openjdk-8-jdk

NB.: without installing gcc-8-base, you would get an error like this :

Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
libc6-dev : Breaks: libgcc-8-dev (< 8.4.0-2~) but 8.3.0-6+rpi1 is to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.

 

Now, you can install OpenHab 2:

$ wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab2.list
$ sudo apt-get update

If you get an error like this one:

E: The repository 'https://openhab.jfrog.io/openhab/openhab-linuxpkg unstable Release' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

Then do:

$ echo 'deb [trusted=yes] https://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab2.list

Finally, do:

$ sudo apt-get install openhab2
$ sudo apt-get install openhab2-addons
$ sudo systemctl daemon-reload
$ sudo systemctl enable openhab2.service
$ sudo adduser openhab dialout
$ sudo adduser openhab tty

Edit /etc/default/openhab2 to add access for Java to the serial ports (ex.:for Zwave keys)

$ nano /etc/default/openhab2 

EXTRA_JAVA_OPTS="-Dgnu.io.rxtx.SerialPorts=/dev/ttyUSB0:/dev/ttyS0:/dev/ttyS2:/dev/ttyACM0:/dev/ttyAMA0"

It should output:

openhab2.service - openHAB 2 - empowering the smart home
Loaded: loaded (/usr/lib/systemd/system/openhab2.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2020-07-15 21:57:07 BST; 28min ago
Docs: https://www.openhab.org/docs/
https://community.openhab.org
Main PID: 26101 (java)
Tasks: 101 (limit: 4915)
Memory: 212.3M
CGroup: /system.slice/openhab2.service
└─26101 /usr/bin/java -Dopenhab.home=/usr/share/openhab2 -Dopenhab.conf=/etc/openhab2 -Dopenhab.runtime=/usr/share/openhab2/runtime -Dopenhab.userdata=/var/lib/openhab2 -Dopenhab.logdir=/var/log/openhab2 -Dfelix.cm.dir=/var/li

Jul 15 21:57:07 Helios systemd[1]: Started openHAB 2 - empowering the smart home.

 

As far as I am concerned, I share via smb the various folders

Edit /etc/samba/smb.conf

$ sudo nano /etc/samba/smb.conf

[openHAB2-userdata]comment=openHAB2 userdata
path=/var/lib/openhab2
browseable=Yes
writeable=Yes
only guest=no
public=no
create mask=0777
directory mask=0777

[openHAB2-conf]comment=openHAB2 site configuration
path=/etc/openhab2
browseable=Yes
writeable=Yes
only guest=no
public=no
create mask=0777
directory mask=0777

[openHAB2-logs]comment=openHAB2 logs
path=/var/log/openhab2
browseable=Yes
writeable=Yes
only guest=no
public=no
create mask=0777
directory mask=0777

[openHAB2-backups]comment=oepnHAB2 backups
path=/var/lib/openhab2/backups
browseable=Yes
writeable=Yes
only guest=no
public=no
create mask=0777
directory mask=0777

Restart the Samba service:

$ sudo systemctl restart smbd.service

 

Start openHab with:

$ sudo systemctl start openhab2.service
$ sudo systemctl status openhab2.service

It can take 15' to be initialized, but soon you should be able to access openHab on your RPI on port 8080!

 

Do a backup with:

$ sudo ./usr/share/openhab2/runtime/bin/backup

Restore a backup with:

$ sudo systemctl stop openhab2.service
$ sudo ./usr/share/openhab2/runtime/bin/restore /var/lib/openhab2/backups/openhab2-backup-....
$ sudo systemctl start openhab2.service

It will take long minutes to restart!

 

More details about installing openHAb on Linux on the official page.

Et voilà!

Raspberry Pi Use a Z-Wave Controller USB Key with openHAB in Docker on a RPI 4

It took me quite some hours to be able to use my Aeotec Z-Stick Gen5 (ZW090) key within my Docker image of openHAB, running on a Raspberry Pi 4 (with a Raspberry Pi OS). Here are all the tips I used.

Click to Read More

First, before plugging the controller  in your RPI, configure it to see the Serial Ports. Connect onto your RPI within a SSH Console (ex.: via Putty)  and type the command:

sudo raspi-config

Use "5 interfacing Options" > "P6 Serial" > "Yes" > "Ok"

And now reboot.

Next, back into a SSH conscole, check what USB devices already exists with the command:

lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

And flush the kernel and boot logs:

sudo dmesg -c >> ~/dmesg-`date +%d%m%Y`.log

Then, plug your Z-Wave Controller USB Key in a USB Port and check that it's detected and mounted properly:

lsusb

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 009: ID 0658:0200 Sigma Designs, Inc. Aeotec Z-Stick Gen5 (ZW090) - UZB
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

dmesg

[ 3124.779069] usb 1-1.4: new full-speed USB device number 9 using xhci_hcd
[ 3124.919928] usb 1-1.4: New USB device found, idVendor=0658, idProduct=0200, bcdDevice= 0.00
[ 3124.919942] usb 1-1.4: New USB device strings: Mfr=0, Product=0, SerialNumber=1
[ 3124.919953] usb 1-1.4: SerialNumber: 32303136-3131-3033-3030-303031383932
[ 3124.926704] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device

 

"lsusb" should show you a new device. Ex.: Aeotec Z-Stick Gen5 (ZW090) - UZB.

And "dmesg" must should you the mount point: cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device.

If you don't see the mount point, then you possibly have a device not supported by the RPI 4. It seems that it is the case with the old Aeotec "Z-Stick Gen5". "New Z-Stick Gen5" and "Z-Stick Gen5+" should however be compatible. But there is a trick: plug your key on the RPI 4 via a USB HUB (2.0 or 3.0).

I presume that the Docker Image is already up and running. If not, install it.

sudo useradd -r -s /sbin/nologin openhab
usermod -a -G openhab pi
mkdir /opt/openhab
mkdir /opt/openhab/conf
mkdir /opt/openhab/userdata
mkdir /opt/openhab/addons
chown -R openhab:openhab /opt/openhab

Check the id of the user openhab with:

id openhab

uid=999(openhab) gid=994(openhab) groups=994(openhab)

Grant access on the Serial Port for the user 'openhab':

sudo chmod 777 /dev/ttyACM0
sudo chown openhab /dev/ttyACM0

And use the uid and gid found above in the following command, setting the ttyA* found previously and specifying the version to be used:

docker run --name openhab --net=host --device=/dev/ttyACM0 -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro -v /opt/openhab/conf:/openhab/conf -v /opt/openhab/userdata:/openhab/userdata -v /opt/openhab/addons:/openhab/addons -d -e USER_ID=<uid> -e GROUP_ID=<gid> --restart=always openhab/openhab:latest

 

Now, using Portainer (because it's easy), open a console within openhab... Portainer is not yet installed ? Do it with:

docker run -d -p 9000:9000 -p 8000:8000 --name portainer1 --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer:/data portainer/portainer:latest

Go to the page http://<Your RPI IP>:9000, open the Containers and click on the "Exec Console" icon of 'openhab' container:

Grant the same accesses inside the image than on the RPI:

sudo chmod 777 /dev/ttyACM0
sudo chown openhab /dev/ttyACM0

chown -R openhab:openhab /opt/openhab

Now restart the 'openhab' container (with the icon Restart ;) ). It will take some minutes to be available. But once you can get into it, go to the Things and configure the Controller to use the Serial Port ttyACM0:

 

Et voilà

SmartHome OpenHab: ServiceLocatorImpl has been shut down

I found a weird error by accident in the openhab.log of my Synology. It was due to the "Localisation" not configured properly in openHab's System.

Click to Read More

I found that error after stopping and starting manually openHab from a SSH console opened on my Synology to solve another issue.

To stop openHab installed on a Synology as explained here, via a SSH console run as root (as explained here), execute:

  • cd /var/packages/openHAB/target
  • ./runtime/bin/stop

To restart openHab later execute:

  • ./runtime/bin/start

NB.: if you execute this command soon after the stop, it won't work. You can simply re-execute the command a second time.

Here are more details about the error that I found in the log (located into \\<YourNas>\SmartHome\openHAB\userdata\logs\openhab.log)

javax.servlet.ServletException: javax.servlet.ServletException: A MultiException has 1 exceptions. They are:
1. java.lang.IllegalStateException: ServiceLocatorImpl(__HK2_Generated_2,3,718060201) has been shut down

at org.ops4j.pax.web.service.jetty.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:88) ~[bundleFile:?]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.server.Server.handle(Server.java:494) ~[bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:374) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:268) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:367) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:782) [bundleFile:9.4.20.v20190813]
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:918) [bundleFile:9.4.20.v20190813]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

This error appears because the location is not set in OpenHAB and your browser probably didn't have the permission to pass its own location to openhab.

The issue can be resolved by manually via the PaperUI > Configuration > System > Regional Settings.  There, define your language, your country/region, your Time Zone and your location (with a latitude and longitude - or - by moving the openHab pin onto your location).

SmartHome Troubleshoot Z-Wave Controller used by OpenHab

After reinstalling openHab on a new Synology, I had some 'Unknown' Z-Wave devices. The only way to et rid of them was to use "Z-Wave PC Controller" from  Silabs (previously named "Zensys tool").

Click to Read More

This is what was displayed in the Paper UI of openHab:

To solve this, I had two options:

The first option was to use the PaperUI's features of openHab to heal, reinitialize the device or remove the device.

The other option was to remove my Z-Wave Controller from my Synology, and plug in into a PC to clean it using Z-Wave PC Controller.

Use PaperUI's feature

Select your device via the PaperUI > Configurations > Things, click on the "Edit icon" (The pen in a blue disc) and scroll to click on the "Show More" link :

There, you have access to the various features :

Try those two actions:

  • "Heal the device" (See here) : it can be useful when the Z-Wave mesh is messed up and nodes become 'lost'.
  • "Reinitialise the device" : it does not hurt ;)

Wait next for a few minutes and refresh your PaperUI to check if the device is know fully recognized. 

Also check if there are any errors in the logs of openHab: events.log and openhab.log. If you installed openHab on your Synology as explained here, those logs are under the Shared Folder \\<YourNas>\SmartHome\openHAB\userdata\logs\

Install Z-Wave PC Controller

The download this software I had to find a "valid" Silabs account. Indeed, standard accounts have no access to the download section. Searching for "Silabs.com" on http://bugmenot.com, we find easily such "valid" account.

Once authenticated on Silbas.com, go to the Z-wave page here, and go to the "PC Programmer" section and click on Download Z-Wave Programmer

On the next page, click on the Download button in the upper-right corner (If it is not accessible anymore, find the msi in the attachement section of this post).

Unzip the archive and install the "PC Controller" (/bin/ZWaveControllerSetup.msi)

Clean-up your Z-Wave Controller

Now, plug your Z-Wave controller in your PC and open "PC Controller":

Click on the Gear icon in the upper-right corner to configure the software to use your Z-Wave Controller. You should see it in the pane "Serial Port Data Sources". Select it and click on "Ok" at the bottom-right:

Now, you have access to all the "data" (Z-Wave devices) configured previously on your controller. Here under, you can see that I have 13 nodes available:

To check which nodes are not yet available, Click on the top-left tail "Network Management". This will show you a list of all configured nodes. For each node, one by one, select it and press on "Is Failed". If the node cannot be accessed, it will be marked in red (See the nodes 23 and 24 here under). You can then remove it by clicking on "Remove Failed".

For each remaining node, you could click on "Node Info". This will collect more information than your controller did when it was connected on your Synology and managed by openHab.

You can add new devices easily, using the "Add" button. I did it for a Fibaro Heat Controller that I couldn't add via openHab.

You can test your Z-Wave Switches using "Basic Set ON" and "Basic Set OFF".

You can look at the topology of your mesh, using the tail "IMA Network" and by clicking on "Network Health".

Once you have cleaned-up your controller, you can re-plug it into your NAS.

Unplug/Re-plug a Z-Wave Controller on a Synology

When you remove and replug such a controller, it usually gets a new "terminal" (=a "new port"). A terminal is physically represented by a file named 'tty...' in the /dev folder and is the communication channel between the system (your Synology) and hardwares like the USB devices. By default, the terminal for the Z-Wave controller will be /dev/ttyACM0. But when you remove and replug it, it can get /dev/ttyACM1.

To check which terminal is used, open a SSH console on your NAS (as explained here) and type: ls -la /dev/ttyA*

You should get something like:
crwxrwxrwx 1 openhab dialout 166, 1 Dec 31 14:26 /dev/ttyACM0

If there are several terminals, unplug to Z-Wave controller, execute the command again and note the remaining names. Next, replug the controller, list again the terminals and compare the list with the one noted previously.

If the security of the terminal is not crwxrwxrwx, then (assuming the terminal is ttyACM0) execute: sudo chmod 777 /dev/ttyACM0

If the user is not openhab, then check first that it exists via the Control Panel of your DSM: Control Panel > User.

If it does not, you have not properly installed openHab on your Synology as explained here. The package is indeed configuring everything itself. If it exists, assuming the terminal is ttyACM0, execute: sudo chown openhab /dev/ttyACM0

If the group is not dialout, check that it exits via the Control Panel of your DSM: Control Panel > Group. Use "Edit Members" to check that the user "openhab" is in that group. NB.: a group "uucp" must also exist and contain the user "openhab".

If not, you didn't properly install openHab on your Synology as explained here. The package is indeed configuring everything itself. If it exists, assuming the terminal is ttyACM0, execute: sudo chgrp dialout /dev/ttyACM0

Finally, to check that the right terminal is used by openHab to communicated with the Z-Wave Controller, go to its configuration via that PaperUI > Configuration > Things. Select your Z-Wave Controller and Edit it. In the "Port Configuration" part, you should see that the "Serial Port" is the terminal you found with the command ls -la /dev/ttyA*.

SmartHomeSynology Change password of OpenHab Console on Synology

To change the OpenHab Console password, you have to edit the /userdata/etc/users.properties file.

Click to Read More

First, open a SSH console on your Synology as root (See here).

Then, create a hashed password with the following command (replace ThisIsMyNewPassword with yours) :

echo -n ThisIsMyNewPassword | sha256sum

It should output someting like this :

8fda687cf4127db96321c86907cbea99dabb0b13aa4bf7555655e1df45e41938 -

If you installed openHab as explained here, the file to be edited is /openHAB/userdata/etc/users.properties in the share /SmartHome of your Synology. Copy the hashed string above (without the dash and the blank) between the {CRYPT} tags:

# This file contains the users, groups, and roles.
# Each line has to be of the format:
#
# USER=PASSWORD,ROLE1,ROLE2,...
# USER=PASSWORD,_g_:GROUP,...
# _g_\:GROUP=ROLE1,ROLE2,...
#
# All users, groups, and roles entered in this file are available after Karaf startup
# and modifiable via the JAAS command group. These users reside in a JAAS domain
# with the name "karaf".
#
openhab = {CRYPT}8fda687cf4127db96321c86907cbea99dabb0b13aa4bf7555655e1df45e41938{CRYPT},_g_:admingroup
_g_\:admingroup = group,admin,manager,viewer,systembundles

To test the new password, open a SSH console on openHab. As by default it may only be accessed from the localhost, the best option is to use GateOne (See here). Once logged in GateOne on your Synology, execute :

ssh -p 8101 openhab@localhost

You should be prompted to enter your password and, if correct, you will see:

Type Ctrl-D to exit the openHab console.

 

NB.: instead of logging in GateOne as admin, you can directly connect on openHab using the port '8101' and the login 'openhab' in GateOne:

SmartHomeSynology Backup & Restore openHab 2.x on Synology

In order to upgrade from openHab 2.4 to 2.5, I had to backup the configuration of openHab, uninstall the v2.4, install the v2.5 and restore the configuration.

Click to Read More

If you installed OpenHab as explained here, you can copy all the folders under /openHAB in the share /SmartHome of your Synology.

OpenHAB 2.x currently has two different ways of setting up things:

  • Either through textual configuration (in /SmartHome/openHAB/conf folder) or
  • through the user interface which saves to a “jsonDB” database (in /SmartHome/openHAB/userdata folder).

Both the textual configuration files and the database folders must be backuped (See here).

OpenHab 2.x comes now with scripts to backup and restore its configuration and database. They are availabe in the folder /runtime/bin. You can access them via a SSH Console on your Synology, under /var/packages/openHAB/target/runtime/bin/ (equivalent to /volume1/@appstore/openHAB/runtime/bin)

These scripts take care of backuping not only the files that you have manually edited in the folder /conf (items, things, scripts, ...), but also everything configured via the paperUI or HABPanel and stored in the folder /userdata (habmin, jsondb,...)

Attention, these scripts do not take care of:

  • backuping the jar files that you have installed manually. Ex.: in /addons
  • backuping the DB you would be using for, e.g., persistence, ...
  • adding the openHAB user ('openhab') to the dialout and tty groups if you did this previously

First, prepare your Synology

  1. Open a SSH console on your Synology as root (See here)
  2. Install the Synology Gear's tools, required to have the command pgrep used by the restore script of openHab, typing the command :
    synogear install
  3. Modify the script '/runtime/bin/restore' to replace unzip (not available anymore on Synology) by 7zip. Concretelly, replace:

command -v unzip >/dev/null 2>&1 || {
echo "'unzip' program was not found, please install it first." >&2
exit 1
}

with

command -v 7z >/dev/null 2>&1 || {
echo "'7z' program was not found, please install it first." >&2
exit 1
}

and 

unzip -oq "$InputFile" -d "$TempDir" || {
echo "Unable to unzip $InputFile, Aborting..." >&2
exit 1
}

with

7z x -y -o"$TempDir" "$InputFile" > /dev/null || {
echo "Unable to unzip $InputFile, Aborting..." >&2
exit 1
}

Next, use the following commands to backup your configurations:

  1. sudo -i
  2. cd /var/packages/openHAB/target
  3. synoservice --stop pkgctl-openHAB
  4. ./runtime/bin/backup
  5. synoservice --start pkgctl-openHAB

You should see something like this as output:

#########################################
openHAB 2.x.x backup script
#########################################

Using '/volume1/@appstore/openHAB/conf' as conf folder...
Using '/volume1/@appstore/openHAB/userdata' as userdata folder...
Using '/volume1/@appstore/openHAB/runtime' as runtime folder...
Using '/volume1/@appstore/openHAB/backups' as backup folder...
Writing to '/volume1/@appstore/openHAB/backups/openhab2-backup-19_12_25-12_27_33.zip'...
Making Temporary Directory if it is not already there
Using /tmp/openhab2/backup as TempDir
Copying configuration to temporary folder...
Removing unnecessary files...
Zipping folder...
Removing temporary files...
Success! Backup made in /volume1/@appstore/openHAB/backups/openhab2-backup-19_12_25-12_27_33.zip

Before uninstalling openHab, if you intend to install a new version, copy the backup into a safe folder, like the tmp folder :

cp /volume1/@appstore/openHAB/backups/openhab2-backup-19_12_25-12_27_33.zip /tmp/openhab2-backup.zip

Finally, use the following commands to restore your configurations:

  1. sudo -i
  2. cd /var/packages/openHAB/target
  3. synoservice --stop pkgctl-openHAB
  4. ./runtime/bin/restore /tmp/openhab2-backup.zip
  5. synoservice --start pkgctl-openHAB

You should see an output like this:

##########################################
openHAB 2.x.x restore script
##########################################

Using '/volume1/@appstore/openHAB/conf' as conf folder...
Using '/volume1/@appstore/openHAB/userdata' as userdata folder...
Making Temporary Directory
Extracting zip file to temporary folder.

Backup Information:
-------------------
Backup Version | 2.5.0 (You are on 2.4.0)
Backup Timestamp | 19_12_25-12_27_33
Config belongs to user | openhab
from group | users

Your current configuration will become owned by openhab:users.

Any existing files with the same name will be replaced.
Any file without a replacement will be deleted.

Okay to Continue? [y/N]: y
Moving system files in userdata to temporary folder
Deleting old userdata folder...
Restoring system files in userdata...
Deleting old conf folder...
Restoring openHAB with backup configuration...
Deleting temporary files...
Backup successfully restored!

 

If opening openHab weg page immediatly, you will see that it's restoring the UI:

Please stand by while UIs are being installed. This can take several minutes.

Once done, you will have access to your PaperUI, BasicUI, HabPanel, etc...