Re: Esecuzione di JEMMA da Eclipse

23 views
Skip to first unread message

ricca...@gmail.com

unread,
May 29, 2015, 10:48:56 AM5/29/15
to Roberto Pierpaoli, jemma-de...@googlegroups.com, jemma-...@googlegroups.com
Dear Roberto,

(switiching to English and enlarging to the main ML as other people may stumble in the same issue).

I just updated the instructions to set-up JEMMA in your Eclipse environment, as it was a little outdated https://github.com/ismb/jemma/wiki/JemmaOnEclipse 

Note that the procedure describe there will also generate a binary set for you i.e. in the "Distribution" project).

Note that at the moment a small number of bundler have not been yet "mavenized" so you'll have to export them manually from Eclipse:

ismb/it.ismb.pert.osgi.dal
ismb/it.ismb.pert.osgi.dal.functions
ismb/it.ismb.pert.osgi.dal.functions.eh
ismb/jemma.osgi.dal
ismb/it.ismb.pert.osgi.dal.web-apis

About the errors: at the moment if you use the default configuration you may see a lot of DEBUG/WARNING/ERROR messages - which may be related to some bundle but not critical.

(In the next upcoming releases we'll probably try to make the default logs a little less chatty and a little more meaningful - but at the moment this is what we have ;-) ).

After you tried the updated instructions, if If you want to dump the error messages in a file and circulate it to us we can try and help you sorting out.

BR,

Riccardo

Il giorno ven 22 mag 2015 alle ore 13:09 Roberto Pierpaoli <roberto....@gmail.com> ha scritto:
Buongiorno,

scrivo per chiedere qualche suggerimento in merito all'esecuzione di JEMMA da ambiente Eclipse.

Premetto che il mio obbiettivo primario è di eseguire JEMMA nella sua versione più aggiornata, poterlo fare da Eclipse (con debugger e quant'altro) è un valore aggiunto che mi piacerebbe avere, ma è meno priotario rispetto al semplice aggiornamento.

Ho seguito la guida https://github.com/ismb/jemma/wiki/JemmaOnEclipse ed il mio ambiente Eclipse è allineato col Git sul master.
Ho notato alcune differenze tra la guida e l'ambiente che si viene a creare, in particolare in relazione alle "Run Configurations", che sono in numero maggiore e ed hanno nomi differenti.

Ho collegato la chiavetta al PC (ambiente Linux Ubuntu 13.10) e provato tutte le Run Configurations, ma qualunque io tenti vengono visualizzati in console numerosi errori.

Vi chiederei, in sostanza, di indicarmi se ci sono dei passi/accorgimenti per l'esecuzione su Eclipse che, per questioni di aggiornamento, non sono presenti nella guida di cui sopra.
In alternativa (o in aggiunta) vi sarei grato se poteste indicarmi come produrre un'eseguibile aggiornato: al momento ho a disposizione la versione 9.0, scaricata dal portale.

Grazie mille in anticipo e complimenti per la qualità del lavoro che avete svolto,



Roberto

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "JEMMA Developers" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a jemma-develope...@googlegroups.com.
Per altre opzioni visita https://groups.google.com/d/optout.

Roberto Pierpaoli

unread,
Jun 3, 2015, 11:09:07 AM6/3/15
to ricca...@gmail.com, jemma-de...@googlegroups.com, jemma-...@googlegroups.com
Dear Riccardo,

thank you very much for your helpful feedback.
I have followed the updated instructions and made many tests, I have plenty of new questions now, I'll try to be concise, I hope not to bore you too much...
I will also write down some comments, in case they may be useful for you or other readers.

Premise: my target platform at the moment is Linux x86_64, precisely Lubuntu Linux 13.10 and 14.04.

About the updated how-to page
  • there's a small oversight in the tutorial: "ismb/jemma.osgi.javagal" is listed among both the "mavenized" and the "non-mavenized" projects

  • when manually exporting  the non-mavenized projects to JARs, by default Eclipse would re-generate and replace the manifest file, so it's important to choose the option in the wizard for using the manifest file already included in the project you are exporting (maybe it's obvious, but I didn't get at first)

  • the right run configuration (I mean the one that behaves like the stand-alone binary version) seems to be "javagal Linux and APIs", actually it's not clear to me the role of the "javagal Linux" run configuration which does not include any of the target platform's bundles

  • in the "Run Configurations" wizard, the "Include optional dependencies..." checkbox and the "Add new workspace bundle to..." checkbox seem to be needed, is it right?

  • I'd like to share the steps that I usually follow to get a working binary distribution after building from the sources, so that you can highlight my possible mistakes:
    • create a filesystem structure like the one in the "bin_dist_folder_struct.png" attachment (basically a copy of Jemma's official binary distribution)
    • the "generate_configini.sh" file is copied from /jemma.Distribution/generate_configini.sh
    • the "configuration" folder is supposed to be empty
    • the "plugins" folder is supposed to be empty
    • copy all the contents of /jemma.Distribution/target/jemma.Distribution-0.2-bin/modules/dependencies into "plugins"
    • copy all the contents of /jemma.Distribution/target/jemma.Distribution-0.2-bin/modules/jemma into "plugins"
    • manually export JARs for 
      • ismb/it.ismb.pert.osgi.dal
      • ismb/it.ismb.pert.osgi.dal.functions
      • ismb/it.ismb.pert.osgi.dal.functions.eh
      • ismb/jemma.osgi.dal
      • ismb/it.ismb.pert.osgi.dal.web-apis

        all the JARs must be placed into "plugins"
    • execute "generate_configini.sh" to create the config.ini file inside "configuration"
    • launch ./start.sh

  • to run Jemma on my Lubuntu Linux, I needed to add my user to the "dialout" group, otherwise the program was not able to access the /dev/ttyUSB0 device (the FlexKey)

  • I have also run Jemma on a Virtualbox VM (guest Debian 7.8 x86_64) and I have figured out that the "Virtualbox Extension Pack" is mandatory to have Jemma working properly

Questions about the Run Configurations
  • under the "Arguments" tab, section "VM Arguments", I found a property defined as -Dosgi.instance.area=/tmp/: what does it imply?

  • the default config path for the run configuration ("Settings" => "Configuration Area") is set inside the ".metadata" directory, under Eclipse's workspace: is that acceptable or one should change that path?

Differences between executing inside Eclipse and with the binary distribution
  • when running "javagal Linux and APIs" in Eclipse, the following bundles are not loaded (while they are present in the binary distrubution)
    • jemma.osgi.ah.demo.fakevalues
    • jssc
    • jemma.osgi.ah.io
    • jemma.osgi.ah.webui.energyathome
    • osgi.cmpn
is that expected?
Since those bundle are just explicitely excluded from the Run Configuration, I have copied "javagal Linux and APIs" to a new Run Configuration where I have added those bundles: I hope this is correct.

Only "jssc" could not be added: the error messages suggest that bundle is related to accessing serial ports under Windows, so maybe that's the reason why it is not usable under Linux.
  • despite of the Run Configuration, the following references are not loaded when running inside Eclipse (while they are present and running in the binary distribution)
    • easymock-2.4.jar
    • JAXBNamespacePreixMapper-2.2.4.jar
    • stax-api-1.0.2.jar
    • wstx-asl-3.2.3.jar
Those JARs are placed into /jemma.Distribution/target/jemma.Distribution-0.2-bin/modules/dependencies by the build process and that location is referenced in the target file (jemma.target).
I guess that all JARs in that location should be reported and included under the "Target Platform" section inside the Run Configuration wizard, but this seems to happen only for the JARs that are actual OSGi bundles, thus the aforementioned JARs are ignored.

Errors and exceptions

During the execution I have noticed the following error messages logged:

1[org.energy_home.jemma.ah.io.flexgateway.FlexGatewayButtons] : Exception on Run
java.io.FileNotFoundException: /dev/input/event0 (Permesso negato)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at org.energy_home.jemma.ah.io.flexgateway.FlexGatewayButtons.run(FlexGatewayButtons.java:79)
at java.lang.Thread.run(Thread.java:745)

I think this one is because I'm not using the FlexGateway, but only the key.

2. [org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl] : unable to save nullorg.energy_home.jemma.ah.zigbee.properties
java.net.MalformedURLException: no protocol: nullorg.energy_home.jemma.ah.zigbee.properties
at java.net.URL.<init>(URL.java:586)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.saveProperties(ZigBeeManagerImpl.java:2251)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.setUseNVM(ZigBeeManagerImpl.java:2110)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.loadProperties(ZigBeeManagerImpl.java:2234)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.handleBundleUpgrade(ZigBeeManagerImpl.java:351)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.activate(ZigBeeManagerImpl.java:338)

Not clear.
3. [M2MDevice Connection Timer] ERROR org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager - M2MServiceException: Error while setting up connection - org.apache.http.conn.HttpHostConnectException
[M2MDevice Connection Timer] ERROR org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager - Mapped Exception
org.apache.http.conn.HttpHostConnectException: Connection to http://10.38.0.1:8080 refused
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:158)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:562)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.energy_home.jemma.utils.rest.RestClient.send(RestClient.java:122)
at org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager.connect(M2MDeviceManager.java:140)
at org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager.connectTask(M2MDeviceManager.java:338)
at org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager.connectTask(M2MDeviceManager.java:362)
at org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager.access$000(M2MDeviceManager.java:38)
at org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager$1.run(M2MDeviceManager.java:265)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
Caused by: java.net.ConnectException: Connessione scaduta
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:120)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
... 15 more
[M2MDevice Connection Timer] ERROR org.energy_home.jemma.internal.ah.m2m.device.M2MDeviceManager - M2M Device connection setup task failed with exception
org.energy_home.jemma.ah.m2m.device.M2MServiceException: Error while setting up connection
at org.energy_home.jemma.internal.ah.m2m.device.M2MUtils.mapDeviceException(M2MUtils.java:36)

Periodic calls to http://10.38.0.1:8080 are performed: I've noticed this address is referenced inside two projects (jemma.osgi.ah.m2m.device and jemma.osgi.ah.energyathome), but I don't understand its role.


The crazy Hue Lux lamp

Despite all my doubts, following your instructions and some info from the ML, I have been able to control my Philips Hue Lux lamp: turning on, turning off, toggling, dimming.

I have two main problems:
  • the less severe one: when I stop Jemma and I launch it again, the lamp is still present in the saved configuration (i.e. perfectly visible inside the demo app), but it never gets re-attached: I sistematically have to use the "Reset Philips Hue" button and to add the lamp again and again

  • the more severe one: two days ago, during my simple tests (just switch-on, switch-off, re-launch Jemma and so on) the lamp as gone crazy... It has started flashing at a very high speed, like a strobo, so I switched it immediately off removing the plug. After ~30s I plugged it in again and the strobo effect was still there: I unplugged it. So this time I waited a couple of minutes: I plugged it in and the light was fixed, as normal.
    One minute later the lamp has turned off on its own and from that moment on I have not been able to use it in any way... I'm afraid it's gone...
Now I have ordered the Philips Hue Bridge, to figure out if I am able to restore the lamp using its native controller, but I think I will need a new lamp also...


Ok, that's all Riccardo, I'm really sorry for having being talkative, I hope for your understanding.
Thank you very much for your support and for that great piece of code that Jemma is.


Roberto

--
Do you want to secure your computer?
Well, close all backdoors... and also "windows"! ;)
bin_dist_folder_struct.png
demo_appl_conf_ok_eclipse.png
demo_hangs_eclipse_exec.png

Riccardo Tomasi

unread,
Jun 4, 2015, 4:15:15 AM6/4/15
to jemma-...@googlegroups.com
Re-posting on jemma-general (I got bounced because of a mailer configuration progrem)

On 04/06/2015 10:09, Riccardo Tomasi wrote:
Hi Roberto,

Not boring at all  ;-). Some comments & answers in-line below.

I only managed to answer the "quick" points - but on Saturday I'll meet with some other JEMMA developers at the Mini Maker Faire Torino : hopefully we'll find some time to look at your looks in more details there.

BR,

Riccardo


On 03/06/2015 17:08, Roberto Pierpaoli wrote:
Dear Riccardo,

thank you very much for your helpful feedback.
I have followed the updated instructions and made many tests, I have plenty of new questions now, I'll try to be concise, I hope not to bore you too much...
I will also write down some comments, in case they may be useful for you or other readers.

Premise: my target platform at the moment is Linux x86_64, precisely Lubuntu Linux 13.10 and 14.04.

About the updated how-to page
  • there's a small oversight in the tutorial: "ismb/jemma.osgi.javagal" is listed among both the "mavenized" and the "non-mavenized" projects
Now fixed: thanks!
  • when manually exporting  the non-mavenized projects to JARs, by default Eclipse would re-generate and replace the manifest file, so it's important to choose the option in the wizard for using the manifest file already included in the project you are exporting (maybe it's obvious, but I didn't get at first)
Good point: actually we don't have a tutorial on "exporting" JARs because after all bundles will have been mavenized that would be the default way to go - but in reality we often do some manual export, expecially when bundles are in the first stage of development - so this is indeed important to point out ;-) .

  • the right run configuration (I mean the one that behaves like the stand-alone binary version) seems to be "javagal Linux and APIs", actually it's not clear to me the role of the "javagal Linux" run configuration which does not include any of the target platform's bundles
Well: this is a known issue with "sparse" OSGi projects. Actually there is no "default" configuration in JEMMA - because one may mix and match any set of bundles. Anyway having a list of known configuration would be useful - so I created issue 195 to keep the idea for the future
  • in the "Run Configurations" wizard, the "Include optional dependencies..." checkbox and the "Add new workspace bundle to..." checkbox seem to be needed, is it right?
Personally I don't use it - because I prefer to keep control of what is running in my OSGi context - if you are using the "javagal Linux and APIs" you should not need that.

  • I'd like to share the steps that I usually follow to get a working binary distribution after building from the sources, so that you can highlight my possible mistakes:
    • create a filesystem structure like the one in the "bin_dist_folder_struct.png" attachment (basically a copy of Jemma's official binary distribution)
    • the "generate_configini.sh" file is copied from /jemma.Distribution/generate_configini.sh
    • the "configuration" folder is supposed to be empty
    • the "plugins" folder is supposed to be empty
    • copy all the contents of /jemma.Distribution/target/jemma.Distribution-0.2-bin/modules/dependencies into "plugins"
    • copy all the contents of /jemma.Distribution/target/jemma.Distribution-0.2-bin/modules/jemma into "plugins"
    • manually export JARs for 
      • ismb/it.ismb.pert.osgi.dal
      • ismb/it.ismb.pert.osgi.dal.functions
      • ismb/it.ismb.pert.osgi.dal.functions.eh
      • ismb/jemma.osgi.dal
      • ismb/it.ismb.pert.osgi.dal.web-apis

        all the JARs must be placed into "plugins"
    • execute "generate_configini.sh" to create the config.ini file inside "configuration"
    • launch ./start.sh
I haven't tried the exact steps, but it seems the same procedure we use.


  • to run Jemma on my Lubuntu Linux, I needed to add my user to the "dialout" group, otherwise the program was not able to access the /dev/ttyUSB0 device (the FlexKey)
It's written in some other tutorial, but I added it also here since it doesn't hurt.

  • I have also run Jemma on a Virtualbox VM (guest Debian 7.8 x86_64) and I have figured out that the "Virtualbox Extension Pack" is mandatory to have Jemma working properly

Questions about the Run Configurations
  • under the "Arguments" tab, section "VM Arguments", I found a property defined as -Dosgi.instance.area=/tmp/: what does it imply?
If I'm not wrong that's the folder where the OSGi runtime will place all the runtime configurations at launch.


  • the default config path for the run configuration ("Settings" => "Configuration Area") is set inside the ".metadata" directory, under Eclipse's workspace: is that acceptable or one should change that path?
It should be OK: I normally use /home/username/tmp/conf (jointly with an /home/username/tmp/run as "working directory") just to have an easy and quick way to "reset" the OSGi runtime environment - but this is not mandatory.


Differences between executing inside Eclipse and with the binary distribution
  • when running "javagal Linux and APIs" in Eclipse, the following bundles are not loaded (while they are present in the binary distrubution)
    • jemma.osgi.ah.demo.fakevalues
    • jssc
    • jemma.osgi.ah.io
    • jemma.osgi.ah.webui.energyathome
    • osgi.cmpn
is that expected?
Since those bundle are just explicitely excluded from the Run Configuration, I have copied "javagal Linux and APIs" to a new Run Configuration where I have added those bundles: I hope this is correct.

Only "jssc" could not be added: the error messages suggest that bundle is related to accessing serial ports under Windows, so maybe that's the reason why it is not usable under Linux.
  • despite of the Run Configuration, the following references are not loaded when running inside Eclipse (while they are present and running in the binary distribution)

    • easymock-2.4.jar
    • JAXBNamespacePreixMapper-2.2.4.jar
    • stax-api-1.0.2.jar
    • wstx-asl-3.2.3.jar
Those JARs are placed into /jemma.Distribution/target/jemma.Distribution-0.2-bin/modules/dependencies by the build process and that location is referenced in the target file (jemma.target).
I guess that all JARs in that location should be reported and included under the "Target Platform" section inside the Run Configuration wizard, but this seems to happen only for the JARs that are actual OSGi bundles, thus the aforementioned JARs are ignored.
(for this we need to try and reproduce - I'll get back to you if I find some time to do it)



Errors and exceptions

During the execution I have noticed the following error messages logged:

1[org.energy_home.jemma.ah.io.flexgateway.FlexGatewayButtons] : Exception on Run
java.io.FileNotFoundException: /dev/input/event0 (Permesso negato)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at org.energy_home.jemma.ah.io.flexgateway.FlexGatewayButtons.run(FlexGatewayButtons.java:79)
at java.lang.Thread.run(Thread.java:745)

I think this one is because I'm not using the FlexGateway, but only the key.
Correct: I guess (but not sure) that the that code should me moved to a specific FlexGateway-only bundle (or maybe a Fragment ?).

2. [org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl] : unable to save nullorg.energy_home.jemma.ah.zigbee.properties
java.net.MalformedURLException: no protocol: nullorg.energy_home.jemma.ah.zigbee.properties
at java.net.URL.<init>(URL.java:586)
at java.net.URL.<init>(URL.java:483)
at java.net.URL.<init>(URL.java:432)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.saveProperties(ZigBeeManagerImpl.java:2251)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.setUseNVM(ZigBeeManagerImpl.java:2110)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.loadProperties(ZigBeeManagerImpl.java:2234)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.handleBundleUpgrade(ZigBeeManagerImpl.java:351)
at org.energy_home.jemma.ah.internal.zigbee.ZigBeeManagerImpl.activate(ZigBeeManagerImpl.java:338)

Not clear.
Neither: I'll try to dig into it if I have some time.
This is some legacy code (used in some Energy@home trials) which is used to store energy data in a cloud server.
The server is not reachable because it is only reachable within a VPN.
Actually this bundle is not needed if you don't participate to a trial - so you could remove it from the run configuration.
(we need to double-check about this just to be sure the bundle does not contain some legacy code required also for other stuff).



The crazy Hue Lux lamp

Despite all my doubts, following your instructions and some info from the ML, I have been able to control my Philips Hue Lux lamp: turning on, turning off, toggling, dimming.

I have two main problems:
  • the less severe one: when I stop Jemma and I launch it again, the lamp is still present in the saved configuration (i.e. perfectly visible inside the demo app), but it never gets re-attached: I sistematically have to use the "Reset Philips Hue" button and to add the lamp again and again

  • the more severe one: two days ago, during my simple tests (just switch-on, switch-off, re-launch Jemma and so on) the lamp as gone crazy... It has started flashing at a very high speed, like a strobo, so I switched it immediately off removing the plug. After ~30s I plugged it in again and the strobo effect was still there: I unplugged it. So this time I waited a couple of minutes: I plugged it in and the light was fixed, as normal.
    One minute later the lamp has turned off on its own and from that moment on I have not been able to use it in any way... I'm afraid it's gone...
Now I have ordered the Philips Hue Bridge, to figure out if I am able to restore the lamp using its native controller, but I think I will need a new lamp also...

That's weird! I never experienced something like this (I have 4 lamps and 2 strips which I use at home regularly ... ). May be a defective lamp ?

--
JEMMA - Java Energy ManageMent Application framework - http://jemma.energy-home.org
---
You received this message because you are subscribed to the Google Groups "JEMMA General Mailing List" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jemma-genera...@googlegroups.com.
To post to this group, send email to jemma-...@googlegroups.com.
Visit this group at http://groups.google.com/group/jemma-general.
To view this discussion on the web visit https://groups.google.com/d/msgid/jemma-general/CAP6xZ%3DJ0f4RRC17oXvn_mR2YG_AHxiYw1%3D9VYA2KeHerM0Vk3g%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

--
Riccardo Tomasi

--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "JEMMA Developers" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a jemma-develope...@googlegroups.com.
Per altre opzioni visita https://groups.google.com/d/optout.

--
Riccardo Tomasi

Reply all
Reply to author
Forward
0 new messages