Signal Binding

New version released 3.4.0-BETA3
As usual, remove the binding, then readd it from the marketplace.
You may have to restart openHAB if you have the error " Instance is not an SignalActions class." when using actions.

  • Compatibility with openHAB 3.4.x and 4.0
  • A new action to send images.

Should be good now (I hope). Feedback welcome.

Sorry for those waiting for something relating to SQLite error, but my tests with a replacement h2 database didn’t work at all. There are too many differences… I think we are stuck with sqlite. I changed one or two line of code about the way of initializing sqlite, but I don’t have high hope. Worth a try maybe, and as usual, feedback welcome.

It is now possible to use an action to send image. See documentation link in open post. “Feedback welcome” :sweat_smile:

Hi Gwendal,

Thanks for your effort to port it to OH4.
I tried to get it running, but I also encounter an SQLite issue now:

20:52:24.131 [WARN ] [ommon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception:
java.lang.UnsatisfiedLinkError: 'void org.sqlite.core.NativeDB._open_utf8(byte[], int)'
        at org.sqlite.core.NativeDB._open_utf8(Native Method) ~[?:?]
        at org.sqlite.core.NativeDB._open(NativeDB.java:75) ~[?:?]
        at org.sqlite.core.DB.open(DB.java:216) ~[?:?]
        at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:285) ~[?:?]
        at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:65) ~[?:?]
        at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28) ~[?:?]
        at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:19) ~[?:?]
        at org.sqlite.JDBC.createConnection(JDBC.java:104) ~[?:?]
        at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:440) ~[?:?]
        at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:432) ~[?:?]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[?:?]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[?:?]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) ~[?:?]
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[?:?]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) ~[?:?]
        at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81) ~[?:?]
        at org.asamk.signal.manager.storage.Database.getHikariDataSource(Database.java:103) ~[?:?]
        at org.asamk.signal.manager.storage.Database.initDatabase(Database.java:32) ~[?:?]
        at org.asamk.signal.manager.storage.AccountDatabase.init(AccountDatabase.java:32) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.lambda$48(SignalAccount.java:1114) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.getOrCreate(SignalAccount.java:1523) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.getAccountDatabase(SignalAccount.java:1112) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.lambda$38(SignalAccount.java:1087) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.getOrCreate(SignalAccount.java:1523) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.getRecipientStore(SignalAccount.java:1086) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.getProfileStore(SignalAccount.java:1091) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.migrateLegacyConfigs(SignalAccount.java:335) ~[?:?]
        at org.asamk.signal.manager.storage.SignalAccount.load(SignalAccount.java:182) ~[?:?]
        at org.asamk.signal.manager.SignalAccountFiles.initManager(SignalAccountFiles.java:92) ~[?:?]
        at org.asamk.signal.manager.SignalAccountFiles.initManager(SignalAccountFiles.java:80) ~[?:?]
        at org.openhab.binding.signal.internal.protocol.SignalService.start(SignalService.java:146) ~[?:?]
        at org.openhab.binding.signal.internal.handler.SignalBridgeHandler.checkAndStartServiceIfNeeded(SignalBridgeHandler.java:161) ~[?:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[?:?]
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) ~[?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]

Best,
Markus

Many Thanks!!!
It works perfect!
Have a nice Eastern!

Hi Gwendal,

Thanks for your update, but unfortunately also on my end there is no improvement.

OH 3.4.2 with openHABian on a Pi4, dedicated signal account with landline number

I deleted all Signal things, removed the binding, deleted folder userdata/signal, re-started openHAB with cleared cache, installed the updated binding from marketplace, and when I tried to add a new signalaccount thing I got these entries in the logs:

2023-04-07 09:54:47.326 [ERROR] [com.zaxxer.hikari.pool.HikariPool   ] - HikariPool-1 - Exception during pool initialization.

java.sql.SQLException: Error opening connection

	at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:281) ~[?:?]

	at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:65) ~[?:?]

	at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28) ~[?:?]

	at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:19) ~[?:?]

	at org.sqlite.JDBC.createConnection(JDBC.java:104) ~[?:?]

	at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:440) ~[?:?]

	at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:432) ~[?:?]

	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[?:?]

	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) ~[?:?]

	at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81) ~[?:?]

	at org.asamk.signal.manager.storage.Database.getHikariDataSource(Database.java:103) ~[?:?]

	at org.asamk.signal.manager.storage.Database.initDatabase(Database.java:32) ~[?:?]

	at org.asamk.signal.manager.storage.AccountDatabase.init(AccountDatabase.java:32) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.lambda$48(SignalAccount.java:1114) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getOrCreate(SignalAccount.java:1523) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getAccountDatabase(SignalAccount.java:1112) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.lambda$38(SignalAccount.java:1087) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getOrCreate(SignalAccount.java:1523) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getRecipientStore(SignalAccount.java:1086) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getProfileStore(SignalAccount.java:1091) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.migrateLegacyConfigs(SignalAccount.java:335) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.create(SignalAccount.java:221) ~[?:?]

	at org.asamk.signal.manager.SignalAccountFiles.initRegistrationManager(SignalAccountFiles.java:154) ~[?:?]

	at org.asamk.signal.manager.SignalAccountFiles.initRegistrationManager(SignalAccountFiles.java:140) ~[?:?]

	at org.openhab.binding.signal.internal.protocol.SignalService.registerMain(SignalService.java:230) ~[?:?]

	at org.openhab.binding.signal.internal.protocol.SignalService.start(SignalService.java:151) ~[?:?]

	at org.openhab.binding.signal.internal.handler.SignalBridgeHandler.checkAndStartServiceIfNeeded(SignalBridgeHandler.java:161) ~[?:?]

	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]

	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) [?:?]

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) [?:?]

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

	at java.lang.Thread.run(Thread.java:829) [?:?]

Caused by: java.lang.Exception: No native library found for os.name=Linux, os.arch=aarch64, paths=[/org/sqlite/native/Linux/aarch64:/var/lib/openhab/tmp/lib]

	at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:375) ~[?:?]

	at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:68) ~[?:?]

	at org.sqlite.core.NativeDB.load(NativeDB.java:63) ~[?:?]

	at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:278) ~[?:?]

	... 35 more

2023-04-07 09:54:47.362 [WARN ] [mmon.WrappedScheduledExecutorService] - Scheduled runnable ended with an exception: 

com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Error opening connection

	at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:596) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:582) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100) ~[?:?]

	at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81) ~[?:?]

	at org.asamk.signal.manager.storage.Database.getHikariDataSource(Database.java:103) ~[?:?]

	at org.asamk.signal.manager.storage.Database.initDatabase(Database.java:32) ~[?:?]

	at org.asamk.signal.manager.storage.AccountDatabase.init(AccountDatabase.java:32) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.lambda$48(SignalAccount.java:1114) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getOrCreate(SignalAccount.java:1523) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getAccountDatabase(SignalAccount.java:1112) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.lambda$38(SignalAccount.java:1087) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getOrCreate(SignalAccount.java:1523) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getRecipientStore(SignalAccount.java:1086) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.getProfileStore(SignalAccount.java:1091) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.migrateLegacyConfigs(SignalAccount.java:335) ~[?:?]

	at org.asamk.signal.manager.storage.SignalAccount.create(SignalAccount.java:221) ~[?:?]

	at org.asamk.signal.manager.SignalAccountFiles.initRegistrationManager(SignalAccountFiles.java:154) ~[?:?]

	at org.asamk.signal.manager.SignalAccountFiles.initRegistrationManager(SignalAccountFiles.java:140) ~[?:?]

	at org.openhab.binding.signal.internal.protocol.SignalService.registerMain(SignalService.java:230) ~[?:?]

	at org.openhab.binding.signal.internal.protocol.SignalService.start(SignalService.java:151) ~[?:?]

	at org.openhab.binding.signal.internal.handler.SignalBridgeHandler.checkAndStartServiceIfNeeded(SignalBridgeHandler.java:161) ~[?:?]

	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[?:?]

	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) ~[?:?]

	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) ~[?:?]

	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]

	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]

	at java.lang.Thread.run(Thread.java:829) [?:?]

Caused by: java.sql.SQLException: Error opening connection

	at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:281) ~[?:?]

	at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:65) ~[?:?]

	at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28) ~[?:?]

	at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:19) ~[?:?]

	at org.sqlite.JDBC.createConnection(JDBC.java:104) ~[?:?]

	at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:440) ~[?:?]

	at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:432) ~[?:?]

	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[?:?]

	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[?:?]

	... 25 more

Caused by: java.lang.Exception: No native library found for os.name=Linux, os.arch=aarch64, paths=[/org/sqlite/native/Linux/aarch64:/var/lib/openhab/tmp/lib]

	at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:375) ~[?:?]

	at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:68) ~[?:?]

	at org.sqlite.core.NativeDB.load(NativeDB.java:63) ~[?:?]

	at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:278) ~[?:?]

	at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:65) ~[?:?]

	at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28) ~[?:?]

	at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:19) ~[?:?]

	at org.sqlite.JDBC.createConnection(JDBC.java:104) ~[?:?]

	at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:440) ~[?:?]

	at org.sqlite.SQLiteDataSource.getConnection(SQLiteDataSource.java:432) ~[?:?]

	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) ~[?:?]

	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) ~[?:?]

	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[?:?]

	... 25 more

Hello,
I positively hate sqlite and osgi.
Can you try to put the sqlite-jdbc driver in the addon folder and see if it fails with the same exception ?
You can find the right version here :
https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.40.0.0/sqlite-jdbc-3.40.0.0.jar
EDIT/UPDATE new version
https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.42.0.1/sqlite-jdbc-3.42.0.1.jar

Hi,
I put the sqlite-jdbc driver in the addon folder.
openhab tells me that it’s active:

openhab> bundle:list | grep SQLite
279 │ Active │  80 │ 3.40.0.0               │ SQLite JDBC

But I can’t see any entry in the log. I stopped and started it several time, but nothing in the log. That’s why I don’t know if it’s really running.

However, after I saw the sqlite error on the signal binding, I installed the sqlite-jdbc from the marketplace (version 4.0.0.M). That seems to work without any issues.

When I find time, I will try to get the signal binding running on a clean installation of openhabian…

Sorry, I was not clear. You don’t have to do anything. Putting the jar in the addon folder is sufficient to activate it : the sqlite service then “exports” its capability (but do nothing on its own), and any other bundle (like signal) can “import” this to use it.
Theoretically it is not needed for the Signal binding, because it embeds directly in its jar every libraries it needs (including sqlite). But in your case this “direct” embedded version doesn’t seem to work.
This is why I hope (not a strong hope) that adding the sqlite jar bundle in the modular osgi way could unlock the Signal binding as a side effect.

Got still the same error:

[ERROR] [com.zaxxer.hikari.pool.HikariPool    ] - HikariPool-1 - Exception during pool initialization.
java.sql.SQLException: Error opening connection

The root cause seems to be that error:

No native library found for os.name=Linux, os.arch=aarch64, paths=[/org/sqlite/native/Linux/aarch64:/var/lib/openhab/tmp/lib]

I googled this error and it should be fixed in jansi 2.4. I wondering why we still see this error…

So, same root cause as @jimmbimm

Suggestion :

  • open the sqlite jar file that I asked you to download previously with an archive software able to open a ZIP file (a JAR file is in fact a ZIP file)
    (https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.42.0.1/sqlite-jdbc-3.42.0.1.jar)
  • extract the .so file in org\sqlite\native\Linux\armv7\
  • put it in the directory /var/lib/openhab/tmp/lib (you may have to create it before, be sure to let openhab able to read it)
  • and then retry (again…)

Thank you for your great work. :+1:

Today I’ve changed my image based notifications from telegram to signal.
It works fine, only the combination of an image with additional text is a small disadvantage. So I have to send two messages.

Hi Gwendal,

Thanks again for your efforts.

It tried moving the jar file to the addon folder as well as extracting the .so file to /var/lib/openhab/tmp/lib.

I also tried both with a clean install of openHABian.

But the error message remains the same.

Hello,

I updated the binding to the latest Version and tinkered around with sending images a bit.
Now the problem occurred that every time I try to send an Image from a rule uploaded to the rules folder the Image doesn’t get send an instead I get the following error in the log:

'sendSignalImage' is not a member of 'org.openhab.core.thing.binding.ThingActions'; 

If I write the same rule in the web UI editor it does work fine and the image does get send. Are there maybe different interpreters used for uploaded and web created rules?

I would very much appreciate your help, thanks in advance.
Paul

Hi, did you have any success in the end? I’m stuck with the same problem…
edit: got it running by copying /org/sqlite/native/Linux/armv7/libsqlitejdbc.so to /var/lib/openhab/tmp/lib (on Openhabian with a Raspi 4) the file in “aarch64” seems to be in an incompatible binary format that can be read (ldd says “not a dynamic executable”)

But now I am running into “rate limit” problems, can’t register my number :-/

Hi, no … so far I still run into the same error.

Hello.

Thanks for your test !
I made a new release (BETA 4) with updated signal and signal-cli libraries, I tested it on a clean openhabian, and it seems to work, without installing anything else. I really don’t understand why it works sometimes and sometimes not. Anyway I will make a note with your workaround on the open post.

Two things here :

  • Sorry, I left a bug in the last BETA 3 release, and sms verification was not available anymore (forcing vocal validation)
  • according to signal-cli forum, vocal validation is broken. Error message is “rate limit”, because they forbid to use vocal validation without trying sms validation first. In the discussion linked, a workaround is to try sms first, wait a minute, then vocal. I tried to implement this in the BETA4 release, but I didn’t test. Feedback welcome.

The new BETA4 release change the send action and add a mandatory string argument in last position to put text with image.

Hello,
Strange error. I wrote a rule file and this works for me :

rule "testwithrule"
when
    Item NewItem received command
then
   getActions("signal","signal:signalaccountbridge:bab72f1f7d").sendSignal("+33612345678", "Test signal !")
end

I honnestly don’t know what to do to help you in this case…

Thank you, for your great work.

I am sorry, no good news. Now i got an Communication_error “NonSuccessfulResponseCodeException - [422] Bad response: 422”
How can i check that the phonenummer is or is not registered yet at signal. Maybe one of my several tests was succesful but not noticed be me. And if so, how can i remove my registration?
You wrote that now are two steps necessary. Frist try with SMS which fails and second try with vocal response. Do i need for the second step a new captcha link?

Thanks so far

So, now i got it. Don´t ask why or how.
Maybe it would be an advantage if the registration manual would be a little more specific with more details.
I tried a lot and now registration is completed.
Thank you for creating this binding and the help.