Come modificare un plugin

54 views
Skip to first unread message

Giuseppe Pannullo

unread,
May 21, 2016, 2:42:40 AM5/21/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao a tutti e grazie a freedomotic per il prodotto che ha realizzato,
sto integrando freedomotic con hw messo a disposizione da ProgettiHwSw (vi lascio il link , consigliato) e vorrei apportare qualche modifica, esiste qualche documentazione che spiega come e dove intervenire?

Grazie 
Giuseppe

Mauro Cicolella

unread,
May 21, 2016, 4:38:22 AM5/21/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao Giuseppe
grazie per la partecipazione al gruppo.
In effetti non c'è una vera e propria documentazione al riguardo. A causa delle scarse risorse disponibili viene sempre un po' trascurata. Tuttavia posso fornirti delle indicazioni e magari questa può essere l'occasione per migliorarla e/o realizzarla.

Prima di tutto occorre che tu crei un fork del progetto e cloni il codice (https://github.com/freedomotic/freedomotic/wiki)

Cerco brevemente di spiegare come funziona. Bisogna distinguere la parte sensore da quella attuatore. La prima gestita
nel metodo onRun() si occupa di interrogare il file status.xml ad intervalli regolari fissati dal polling time.
Questo perché mancando un sistema push degli aggiornamenti non è possibile sapere se lo stato di un relè o di un ingresso è cambiato se non attraverso delle continue richieste.
I valori letti sono confrontati con quelli in memoria in modo da generare un evento solo in caso di variazione per ottimizzare le risorse.
La sezione attuatore (metodo onCommand()) si occupa di fare delle opportune chiamate GET al webserver integrato nella scheda per cambiare lo stato dei relè. A seconda che sia attiva o meno l'autenticazione verranno passate le credenziali di accesso.
Ogni tupla corrisponde ad una differente scheda e questo permette di gestirne più d'una allo stesso tempo.
Basta differenziare l'alias e l'indirizzo ip con relativa porta.

Non voglio aggiungere altro per ora.
Se ci sono domande specifiche scrivi pure. Proverò a rispondere quanto prima.

Grazie
Mauro

Giuseppe Pannullo

unread,
May 24, 2016, 2:46:10 AM5/24/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao Mauro...
ho forkato il progetto, scaricato e compilato come indicato nella guida... java non mi fa impazzire come linguaggio però cercherò comunque di dare il mio contributo. Compilato ed eseguito, risultato tutto ok. Ora il primo dubbio... ho applicato delle stampe al plugin phwswethv2, giusto per capire cosa succede, ma come si ricompila e ricarica il plugin? mi scuso in anticipo per la mia ignoranza.
Voglio far leggere lo stato della temperatura; ho un file status fatto così:
<response>
<led0>0</led0>
<led1>1</led1>
<led2>0</led2>
<led3>0</led3>
<led4>0</led4>
<led5>0</led5>
<led6>0</led6>
<led7>0</led7>
<btn5>up</btn5>
<btn6>up</btn6>
<btn7>up</btn7>
<pot1>0</pot1>
<pot2>0</pot2>
<pot3>0</pot3>
<pot4>0</pot4>
<temp>22.9</temp>
<dbgS>-</dbgS>
<dbgC>-</dbgC>
</response>
All'oggetto termometro volevo associare il dato di input "temp" e leggere i valori, volevo capire dal codice che tipo di parametro passare nella text "Indirizzo" dell'oggetto.
Mi dai qualche altra info?
Grazie

Mauro Cicolella

unread,
May 24, 2016, 3:57:50 AM5/24/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao Giuseppe,
partirei dal primo quesito. Per modificare il plugin occorre accedere, dall'ide che utilizzi, alla cartella freedomotic\plugins\devices e aprire il progetto maven phwswethv2 ovvero https://github.com/freedomotic/freedomotic/tree/master/plugins/devices/phwswethv2
Una volta compilato (in genere c'è un'opzione build o compile dipende dall'ide) troverai il plugin nella sua sottocartella "target".
Per provarlo puoi copiare la cartella contenuta in "target" e chiamata "phwswethv2" all'interno della tua installazione di Freedomotic.
Se è tutto ok possiamo procedere con le modifiche. Che IDE utilizzi?


Mauro

Il giorno sabato 21 maggio 2016 08:42:40 UTC+2, Giuseppe Pannullo ha scritto:

Giuseppe Pannullo

unread,
May 24, 2016, 6:48:15 AM5/24/16
to Freedomotic - IoT and Smart Spaces Framework
Sto utilizzando come IDE IntelliJ della JetBrains, però al momento lo usi solo come editor perché sto studiando come si integra con mvn, se ne hai uno dedicato o sai come lo devo configurare mi rendi la vita più semplice... 
Trovato come compilare ed installare.. dalla directory del plugin lancio il comando mvc clean build install che pulisce compila e copia nella directory di deploy il plugin... eseguo e il gioco è fatto... mezzo problema risolto, se mi dai qualche dritta sulla configurazione di intelliJ o altro IDE mi fa piacere.

Punto due:
Voglio leggere la temperatura: immagino sia semplice, ma sto capendo la logica di come funziona: mi dai qualche suggerimento?

Mauro Cicolella

unread,
May 24, 2016, 8:49:04 AM5/24/16
to Freedomotic - IoT and Smart Spaces Framework
Personalmente mi trovo bene con Netbeans.

Per gestire la temperatura in primo luogo modificherei i parametri della scheda (le tuple nel file manifest xml) in modo da avere il tag e il numero di sonde.
Andrea mi ha detto che alcune schede ne hanno più di una e in questo caso nel file status.xml ci sono i tag <tem0>, <tem1> ecc.
Mentre nel tuo caso c'è solo <temp>.
Quindi andrebbe modificata la classe Board per gestire questi nuovi attributi e di conseguenza il metodo loadBoards().
E infine il metodo evaluateDiffs(Document doc,  Board board) in cui sarebbe più utile chiamare un metodo specifico valueTagTemperature o qualcosa del genere da creare ad hoc prendendo spunto da valueTag.

 Mauro

Il giorno sabato 21 maggio 2016 08:42:40 UTC+2, Giuseppe Pannullo ha scritto:

Giuseppe Pannullo

unread,
May 26, 2016, 2:03:43 AM5/26/16
to Freedomotic - IoT and Smart Spaces Framework
Ok ci sono quasi... ti racconto cosa ho fatto: che alcuni dispositivi abbiano n tag temperature ed altri non abbiano un indice credo sia qualcosa da risolvere con andrea... tutti gli oggetti per come la vedo io devono avere un indice così si crea uno standard sia per Andrea che per chi poi deve leggere i dati. Assunto che il tag temperature si chiami temp0 e che ne possono esistere n, ho modificato il file manifest.xml e ho introdotto:
<property name="temperature-number" value="1"/>
<property name="temp-tag" value="temp"/>
<property name="monitor-temperature" value="true"/>

così da gestire un tag solo per il sensore temperature. A differenza di altri il valore che legge è un float. Modificato anche la class ProgettiHwSwEthv2 e il dato viene letto, viene gestito il cambio valore e si generano gli eventi previsti. 

Tutto ok fin qui: ho cliccato sull'oggetto temperature per passargli l'indirizzo del termometro tipo default:1:temp e fin qui tutto ok, ma quando cambia il file xml e legge il nuovo dato, la temperatura letta è sempre -60.0, perché? Mi vorrei aspettare che mi riportasse il valore letto...

Che ne pensi? Ho fatto un push sul mio fork se vuoi leggere il codice https://github.com/gpannullo/freedomotic

Mauro Cicolella

unread,
May 26, 2016, 2:47:13 AM5/26/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao
nel metodo sendChanges() non vedo il filtro sul tag "temp" e il conseguente evento generato e notificato.
Inoltre manca il trigger (file .xtrg nella cartella data/trg) da associare alla proprietà "temperature" (tab Sorgenti Dati) dell'oggetto Thermometer in modo che possa acquisire il valore dall'evento specifico.


Mauro

Il giorno sabato 21 maggio 2016 08:42:40 UTC+2, Giuseppe Pannullo ha scritto:

Giuseppe Pannullo

unread,
May 27, 2016, 3:13:43 AM5/27/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao Mauro grazie per le varie info, ora la temperatura viene letta correttamente. 
In effetti era quello che mi mancava, seguendo i tuoi suggerimenti ci sono riuscito.
Saluti

Mauro Cicolella

unread,
May 27, 2016, 3:31:06 AM5/27/16
to Freedomotic - IoT and Smart Spaces Framework
Sono contento di esserti stato utile.
Se vuoi condividere il tuo lavoro con gli altri utenti della scheda puoi inviare una PR in modo da integrare le modifiche e aggiornare il plugin sul nostro marketplace.

Mauro

PS: se ti fa piacere potresti fornirci qualche feedback circa la facilità/difficoltà nel modificare il plugin, eventuali carenze riscontrate ecc.
Per noi è fondamentale la comunicazione con gli utenti.


Il giorno sabato 21 maggio 2016 08:42:40 UTC+2, Giuseppe Pannullo ha scritto:

Giuseppe Pannullo

unread,
May 27, 2016, 4:36:44 AM5/27/16
to Freedomotic - IoT and Smart Spaces Framework
Non è male il progetto, certo con un po documentazione sarebbe più rapido implementare... tipo per il file per il trigger l'ho copiato da altri plugin per capire cosa dovevo fare, altrimenti non avrei mai saputo cosa metterci o come farlo... altra cosa che sarebbe utile è sapere la sequenza degli eventi che devi attenderti, per un oggetto quali devono essere gli attributi da implementare ecc... Comunque con un piccolo sforzo il codice è chiaro, se ci sono riuscito io ci può riuscire chiunque

Facendo qualche altro test è nato un altro piccolo dubbio/problema... il plugin funziona bene ma qualcosa non mi torna qualcosa sull'inizializzazione degli oggetti. L'inizializzazione della temperatura genera un'eccezione:


ERROR [ActiveMQ Session Task-20] - Script evaluation in trigger ''ProgettiHwSwEthV2 reads a temperature input'' has returned a null value, maybe the key ''behaviorValue'' is not evaluated properly.

ERROR [ActiveMQ Session Task-20] - 

ERROR [ActiveMQ Session Task-20] - Error while performing trigger check

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

at java.util.ArrayList.rangeCheck(ArrayList.java:653)

at java.util.ArrayList.get(ArrayList.java:429)

at com.freedomotic.core.TriggerCheck.applySensorNotification(TriggerCheck.java:128)

at com.freedomotic.core.TriggerCheck.check(TriggerCheck.java:91)

at com.freedomotic.reactions.Trigger.onMessage(Trigger.java:401)

at com.freedomotic.bus.BusMessagesListener.onMessage(BusMessagesListener.java:107)

at org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:1393)

at org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:131)

at org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:202)

at org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:133)

at org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:48)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)


però se il file status.xml cambia, viene letto l'evento e aggiornato correttamente l'oggetto... Cosa sto sbagliando in fase di inizializzazione?

Mauro Cicolella

unread,
May 27, 2016, 11:20:07 AM5/27/16
to Freedomotic - IoT and Smart Spaces Framework
Se ho capito bene il problema si manifesta solo all'avvio del plugin o sbaglio?
Potresti allegarmi il log? Fai riferimento a https://github.com/freedomotic/freedomotic/wiki/Logging

Riguardo alla documentazione concordo con te. Forse sarebbe meglio aprire un altro topic per discuterne meglio e raccogliere i vari suggerimenti.

Mauro


Il giorno sabato 21 maggio 2016 08:42:40 UTC+2, Giuseppe Pannullo ha scritto:

Giuseppe Pannullo

unread,
Jun 7, 2016, 3:57:35 AM6/7/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao Mauro, ti giro il file di log come richiesto. 

Spulciando un po i log mi sembra di aver capito che behaviorValue non viene settato allo startup del plugin, mentre quando viene vista una variazione del file status.xml, l'evento cattura il nuovo dato e aggiorna behaviorValue che poi mostra il valore. 

Il valore però in fase di start viene letto, infatti:

INFO  [Thread-51] - ProgettiHwSwEth gets relay status from file http://localhost:80/status.xml

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:1:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:2:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:3:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:4:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:5:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:6:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:7:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:8:led'. It's readed status is 0

INFO  [Thread-51] - Sending ProgettiHwSw protocol read event for object address 'default:1:temp'. It's readed status is 20.3 

però non so perché behaviorValue inizialmente è nullo... Secondo me manca qualcosa in fase di startup..
Mi fai sapere
Grazie   
freedomotic.log

Mauro Cicolella

unread,
Jun 7, 2016, 11:23:10 AM6/7/16
to Freedomotic - IoT and Smart Spaces Framework
Ciao Giuseppe
penso che il problema sia legato al fatto che il trigger relativo alla temperatura scatta anche per gli altri valori dei relè in quanto è in ascolto per tutti gli eventi che arrivano sul channel. In questo caso "sensor.temperature" non è presente, ovvero null e di conseguenza vengono sollevate tutte le eccezioni.
Dovrebbe invece filtrare solo quelli che lo riguardano ed ignorare gli altri.
Aggiungi al trigger della temperatura il seguente blocco prima di quello "SET"
<statement> <logical>AND</logical> <attribute>address</attribute> <operand>REGEX</operand> <value>^(.*):(temp.*)$</value> </statement>

Purtroppo Google non lo formatta correttamente nella mail ma credo sia facilmente comprensibile.
Si controlla che l'address dell'oggetto termini con "temp" oppure "temp" seguito da altri caratteri ad esempio nel caso in cui si utilizzi temp0, temp1 ecc.

Fammi sapere se funziona

Mauro

Il giorno sabato 21 maggio 2016 08:42:40 UTC+2, Giuseppe Pannullo ha scritto:
Reply all
Reply to author
Forward
0 new messages