OpenHab ricezione eventi

495 views
Skip to first unread message

Fulvio Spelta

unread,
Mar 19, 2014, 7:03:34 PM3/19/14
to sou...@googlegroups.com
Ciao
con la versione 1.4.0 utilizzando la configurazione:

openhab.cfg
########################## TCP UDP binding ##################################
#
udp:refreshinterval=250
udp:port=25002
udp:addressmask=true
udp:buffersize=1024
tcp:refreshinterval=250
tcp:port=25002
tcp:addressmask=true
tcp:buffersize=1024

openhab.items
String sUDP50 "sUDP [%s]" { udp="<[*:*:REGEX((.*))]" }

openahb.sitemap
Frame label="Status"  {
Text item=sUDP50
}

inviando pacchetti udp all'IP del server OH sulla porta 25002 o mandati in broadcast sempre su porta 25002, vengono ricevuti ed assegnati all'item.

Per completezza di informazioni utilizzando una configurazione dell'item più mirata ad esempio indicando ip del mittente o porta di invio non sono riuscito ad ricevere nulla ottenendo sempre ilmsg di errore "...no channel... data will be discarded"

Dario, fatto salvo l'interfaccia http per la ricezione dello stato al tempo t0 iniziale, se il gateway al cambio stato di uno slot inviasse una notifica strutturata, rimanendo in xml tipo <idnodo><idslot>stato</idslot></idnodo> si potrebbe scrivere una rules che acquisisca l'aggiornamento e lo assegni all'item.

Non proprio immediato ma funzionerebbe.

E' complesso fare una implementazione di test? Se si faccio una cosa io direttamente dentro lo sketch.

ciao
f


Fulvio Spelta

unread,
Mar 19, 2014, 7:46:23 PM3/19/14
to sou...@googlegroups.com
Sono sempre più convinto che un binding nativo non dovrebbe essere proibitivo... Alessandro (che ho capito mastichi bene java) non hai voglia di cimentarti ? :-)

Di Maio, Dario

unread,
Mar 19, 2014, 7:48:46 PM3/19/14
to sou...@googlegroups.com

Se ho capito, vorresti utilizzare XML su UDP, realizzando una sorta di comunicazione ad eventi. Giusto?

Quello che non mi convince é che questa strada richiede una configurazione complessa lato opemHAB. Tentare ovviamente non nuoce.

Nelle prossime settimane sarò fermo, ma credo che la strada di LASTIN sia valida. Bisogna lavorarci per farlo funzionare, poi lato openHAB al massimo si prende il plugin esistente e si tagliano i log per connessione chiusa.

In questo modo la configurazione openHAB dovrebbe rusultare identica a quella attuale, giusto?

Il massimo a mio avviso sarebbe applicare LASTIN su UDP.

Dario.

From Mobile.

--
You received this message because you are subscribed to the Google Groups "souliss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to souliss+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Di Maio, Dario

unread,
Mar 19, 2014, 7:49:51 PM3/19/14
to sou...@googlegroups.com

Alessandro in JAVA é un maestro :)

From Mobile.

On 19 Mar 2014 20:46, "Fulvio Spelta" <fulvio...@gmail.com> wrote:
Sono sempre più convinto che un binding nativo non dovrebbe essere proibitivo... Alessandro (che ho capito mastichi bene java) non hai voglia di cimentarti ? :-)

--

Fulvio Spelta

unread,
Mar 19, 2014, 8:16:07 PM3/19/14
to sou...@googlegroups.com
e allora... Alessandro... :-):-)

Di Maio, Dario

unread,
Mar 19, 2014, 8:20:12 PM3/19/14
to sou...@googlegroups.com

Credo sia complesso manutenere il codice nel tempo, openHAB evolve velocemente e SoulissApp ha diversi aspetti di sviluppo aperti.

Dobbiamo cercare un modo valido per usare i plugin esistenti (o lievemente modificati) in modo efficace.

A me farebbe piacere vedere un plugin per Souliss, ma ci vuole una persona dedicata, il lavoro su SoulissApp già oggi tende ad essere incompatibile con il tempo che il buon Alessandro ha a disposizione.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 19, 2014, 8:24:02 PM3/19/14
to sou...@googlegroups.com

al massimo si prende il plugin esistente e si tagliano i log per connessione chiusa.

In questo modo la configurazione openHAB dovrebbe rusultare identica a quella attuale, giusto?

Non ho capito, ma la risposta dovrebbe essere no.

Il meccanismo basato sullaricezione udp è totalmente diverso e hairagione più complesso 

In pratica dovresti
  • mantenere la configurazione attuale per mandare i comandi e (volendo) ricevere con polling a bassa ferquenza un allineamento e lo stato inziale
  • aggiungere l'item stringa di ascolto
  • aggiungere una rules che al varire dell'item di ascolto analizzi la stringa ricevuta per identificare l'item da aggiornare lo stato da impostare e quindi fare una "postupdate"
i due meccanismi andrebbero in parallelo il vantaggio sarebbe un polling a bassa frequenza e comunque la ricezione ad evento quindi immediata delle varizioni.

Il polling potrebbe essere evitato se ad itervalli regolari anche qui a bassa frequenza il gw inviasse sul canale udp lo stato di tutti gli slot della rete ad esempio ogni 5 o 10 minuti. Allora la configurazione http rimarrebbe solo per inviare i comandi.

Confermo comunque tutto più complicato, più carino ma più complicato.



Di Maio, Dario

unread,
Mar 19, 2014, 8:26:34 PM3/19/14
to sou...@googlegroups.com

Allora anche io non sto capendo un granché.

Ma l'idea di fare un polling a frequenza alta, con chiusura della connessione se non ci sono nuovi dati ed uso di una sola GET senza specificare l'id, dovrebbe funzionare no? Log a parte.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 20, 2014, 2:20:20 AM3/20/14
to sou...@googlegroups.com
Ciao diciamo che stiamo analizzando delle possibilità e dando qualche spunto a chi ci legge non necessariamente finalizzato a pluggare souliss a OH.

Per riassumere oggi sappiamo che per comunicare ad eventi vs OH, al netto di plugin specializzati, abbiamo trovato 3 strade
1 - chiamate REST o URL con parametri
2 - plugin seriale
3 - plugin UDP

I metodi 2 e 3 possono richiedere configurazioni complesse ovvero la scrittura di rules o script per analizzare i dati ricevuti e trasformarli in danni di stato degli item. Questo è conoscenza sempre utile.

Ora rimane da capire se queste strade possono contribuire allans idea di efficientare la connessione souliss-OH e se si come. Nel post precedente a blocchi una possibile idea, complessa concordo, però magari in casi particolari potrebbe essere utile (non necessariamente per souliss o magari per una implementazione custom dove pochi specifici slot hanno necessità particolari di aggiornamento).

L'altra idea, che dobbiamo verificarne la fattibilità lato OH è il polling frequente ma efficientato dove se non c'è stato un cambio stato il GW souliss invece di inviare dati chiude la connessione.

Su questo fronte stiamo al punto:
- alpha implementazione in A5.2 non ancora funzionante
- da verificare lato OH

Ho riassunto tutto a beneficio dei NS appassionati lettori :-)

Prossimi passi
- per mia testardaggine proseguito a analizzare un po' il canale UDP.
- occorre validare l'ipotesi 'chiusura connessione', come procediamo? attendo alpha r3 o provo con ambiente simulato ad hoc?

ciao
f
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Di Maio, Dario

unread,
Mar 20, 2014, 4:19:41 AM3/20/14
to sou...@googlegroups.com

Se riesci a fare delle simulazioni é meglio, perché la r3 richiederà un po di tempo.

Per UDP, quale struttura dati conti di utilizzare?

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 20, 2014, 8:14:00 AM3/20/14
to sou...@googlegroups.com
Ciao ok per le simulazioni, cerco di fare qualcosa.

Per UDP no in ho ancora studiato nulla troppo presto non ho ancora chiaro la soluzione completa.

Domanda: in riferimento alla A5.1 attuale in modalità con persistenza, dove posso intercettare nel codice il punto in cui il GW riceve/gestisce il cambio di stato di uno slot?

L'obiettivo è eventualmente iniettare un pezzetto di codice ah hoc per notificare via UDP le variazioni e testare l'idea.

Comunque ti confermo che non mi convince come metodo generalizzato sto solo cercando di approfondire un pochino per eventuali casi speciali.

THX
f

Di Maio, Dario

unread,
Mar 20, 2014, 4:58:31 PM3/20/14
to sou...@googlegroups.com

In MaCaco.cpp cerchi il nome del functional code 0x15, i commenti dovrebbero aiutarti per il resto.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 22, 2014, 5:14:18 AM3/22/14
to sou...@googlegroups.com
Ciao Dario,
come d'accordo ho effettuato il test relativo alla "chiusura" brutale della chiamata http di OH nel caso in cui non vi siano dati da aggiornare ed il test è positivo. Dettagli

Scenario server
Il server è stato predisposto per rispondere con un valore numerico per le prime 5 chiamate (valore ritornato 1,2,3,4,5) e poi per troncare brutalmente la connessione ad ogni successiva chiamata. Codice utilizzato:
i
mport java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;


/**
 * A TCP server that runs on port 9090.  When a client connects, it
 * sends the client the current date and time, then closes the
 * connection with that client.  Arguably just about the simplest
 * server you can write.
 */

public class Server {
 
 
static int i = 0;


   
/**
     * Runs the server.
     */

   
public static void main(String[] args) throws IOException {
       
ServerSocket listener = new ServerSocket(9090);
       
try {
           
while (true) {
               
Socket socket = listener.accept();
               
try {
               
BufferedReader in = new BufferedReader(
                           
new InputStreamReader(socket.getInputStream()));
                   
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
               
System.out.println("RECEIVED: " + in.readLine());
            i
= i + 1;
               
if (i < 5) {
                   
out.println("HTTP/1.1 200 OK");
                   
out.println("Content-Type: text/plain");
                   
out.println("");
                   
out.println(i);
                   
System.out.println("Inviato response");
               
}
               
else {
                   
System.out.println("No response" + i);                
               
}
               
} finally {
                    socket
.close();
               
}
           
}
       
}
       
finally {
            listener
.close();
       
}
   
}
}


Caso 1
Utilizzo di un item OA con http binding definito a livello di item:
String  sTest     "Test [%s]" { http="<[http://192.168.10.110:9090/pippo.htm:10000:REGEX((.*))]" }

Caso 2
Utilizzo di un item OA con http binding definito a livello di cache (openhab.cfg):
String  sTest     "Test [%s]" { http="<[oatesttruncate:10000:REGEX((.*))]" }

Con definizione a livello openhab.cfg:
http:oatesttruncate.url=http://192.168.10.110:9090/pippo.htm
http
:oatesttruncate.updateInterval=10000

Risultato
In entrambi i casi OH ha ricevuto i valori ritornati aggiornando lo stato dell'item e poi ha mantenuto l'ultimo valore ricevuto in caso di disconnessione brutale.

Nota
OH in caso di disconnessione brutale, prima di considerare la chiamata chiusa con un errore di "no response" effettua 4 chiamate al server http in rapida successione in entrambe le configurazioni.

Di Maio, Dario

unread,
Mar 22, 2014, 7:19:41 AM3/22/14
to sou...@googlegroups.com

Il comportamento é analogo se la disconnessione avviene dopo aver inviato un HTTP Hello?

Grazie,
Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 22, 2014, 3:03:57 PM3/22/14
to sou...@googlegroups.com
Scusa cosa è un http hello ? :-(

Di Maio, Dario

unread,
Mar 22, 2014, 5:11:28 PM3/22/14
to sou...@googlegroups.com

Vero, intendevo HTTP 200.

Dario.

From Mobile.

On 22 Mar 2014 20:03, "Fulvio Spelta" <fulvio...@gmail.com> wrote:
Scusa cosa è un http hello ? :-(

Di Maio, Dario

unread,
Mar 23, 2014, 4:41:22 AM3/23/14
to sou...@googlegroups.com

Prova per favore a spostare quel if(i<5) in basso di tre righe, in modo che la connessione venga semplicemente chiusa inviando HTTP200.
Il fatto che riprovi 4 volte non é buono per il nostro scopo.

Un'altra domanda, visto che non potrà piú essere sottointeso l'id del nodo, creare una regola che individui due elementi id e slot é complicato?

Con questo approccio la chiata sarebbe del tipo GET /status senza specificare alcun id. Poi opeHAB dovrebbe discriminare id e slot per aggiornare il suo stato corrente.
Inoltre l'utilizzo della cache diventerebbe l'unico possibile.

Cerco di inviare per domani il codice Souliss corretto.

Grazie,
Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 23, 2014, 6:34:09 AM3/23/14
to sou...@googlegroups.com
non ti seguo più. Più tardi faccio la prova a restituire http 200, però non mi torna l'approccio.

mi spiego, se il binding lo metto a livello di item la risposta deve essere per quel item.
il trucco della cache consiste nel fatto che lamirl viene chiamata una volta sola ed il risultato passato a tutti gli item che fanno riferimento a quella URL in cache che comunque elaborano il risultato ognuno secondo la propria regola (regex in questo caso)per estrarre il valore dello mstato aggiornato.

questo implica che nella stringa ricevuta ebbe sempre essere presente la coppia nodo-slot per permettere una identificazione certa del tipico/item cui quello stato deve essere assegnato.

la logica di funzionamento pero sarà che quanto restituito alla URL sara dato in pasto a tutti gli item che tramite regex o xslt devono capire se lo stato ritornato è o meno di loro interesse.

a più tardi con esito della prova

Di Maio, Dario

unread,
Mar 23, 2014, 7:34:30 AM3/23/14
to sou...@googlegroups.com

Provo cosí

GET /status
>HTTP 200

GET /status
>HTTP 200 + <id3>...</id3>

GET /status
>HTTP 200

GET /status
>HTTP 200

GET /status
>HTTP 200

GET /status
>HTTP 200 + <id1>...</id1>

GET /status
>HTTP 200

Quindi adesso non sai piú quale id riceverai, la risposta andrà messa in cache e poi analizzata con una REGX per tirarne fuori i valori ed associarli agli item relativi.

Si può fare?

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 23, 2014, 9:36:15 AM3/23/14
to sou...@googlegroups.com
Ciao 2 risposte
Test con invio di http 200 - negativo

OH se vede una risposta "conforme" rispetto al protocollo invia i dati ricevuti all'item per l'analisi e l'estrazione del nuovo stato. In questo caso ottenendo una stringa vuota imposta allo stesso modo lo stato.

Dal log OH:
2014-03-23 14:20:54 - sTest state updated to 1
2014-03-23 14:20:56 - sTest state updated to 2
2014-03-23 14:20:58 - sTest state updated to 3
2014-03-23 14:21:00 - sTest state updated to 4
2014-03-23 14:21:02 - sTest state updated to
2014-03-23 14:21:04 - sTest state updated to
2014-03-23 14:21:06 - sTest state updated to

Proposta di interazione

l'ipotesi potrebbe essere

GET /status
>HTTP 200 + <id1><s2>xxx</s2></id1><id0><s1>xxx</s1></id0>

GET /status
>chiusura connessione

In parole: se non ci sono dati la connessione viene abbattuta

Se ci sono dati gli slot vengono passati nella response ed ognuno è chiaramente identificabile dalla coppia id-slot (come oggi)

Lato OH ho comunque dubbi. Sono certo che funzionerebbe nella configurazione:

1 solo item viene legato al binding e ad ogni cambio stato (quindi dati ricevuti) viene attivatra una rule che analizza i dati e poi imposta lo stato sull'item corretto che però è legato al binding http solo per l'imvio comandi e non per la ricezione dello stato che aviene solo tramite l'item "buffer" e il codice della rule.

(stessa tecnica di analisi necessaria se ricevessimo i dati realmente ad evento attraverso il binding udp - scenario dal quale siamo partiti)

Non sono affatto certo che possa funzionare se gli item sono legati ognuno al binding http per la ricezione dei dati sarebbe tutto da provare

Mi manca come si acquisisce lo stato "inziale" a fronte dell'avvio di OH.

ciao

Di Maio, Dario

unread,
Mar 23, 2014, 9:53:48 AM3/23/14
to sou...@googlegroups.com

Per ogni GET si possono ottenere solo dati relativi ad un unico nodo, non ad altri. Questo semplica la sintassi della REGX?
Associare l'id ad ogni slot é fattibile, ma richiede un buffer in RAM sensibilmente maggiore.

Data la sintassi, si può anche pensare di costruire il buffer dati direttamente nel W5x00, soluzione non particolarmente complessa, si può realizzare con una struttura dati apposita. Ma lascio questo passo alle finiture successive.

All'inzio i dati verranno ottenuti in ordine sparso. Si può realizzare una chiamata del tipo GET /refresh da pollare una tantum, che vada ad azzerare tutti i contatori delle sottoscrizioni. Questo genererebbe il traffico che andrebbe ad alimentare LASTIN.

Dario.

From Mobile.

--

Fulvio Spelta

unread,
Mar 23, 2014, 11:27:28 AM3/23/14
to sou...@googlegroups.com
Perdonami ma continuo a seguirti con fatica perchè non riesco a vedere il disegno finale che hai in mente e quindi rispondo alle tue domande ma senza riuscire e relare fra loro le cose, tra l'altro con il rischio di sparare anche qualche cavolata.

Per punti (per me sconnessi):


Per ogni GET si possono ottenere solo dati relativi ad un unico nodo, non ad altri. Questo semplica la sintassi della REGX?
Associare l'id ad ogni slot é fattibile, ma richiede un buffer in RAM sensibilmente maggiore.

Se non conosco il nodo non so a quale item associare i dati che ricevo (questa è una risposta molto a rischio perchè non ho capito come pensi che sia il funzionamento e quindi ti rispondo pensando ad un contesto che però è nella mia testa e non so se corrisponde al tuo disegno)
 

Data la sintassi, si può anche pensare di costruire il buffer dati direttamente nel W5x00, soluzione non particolarmente complessa, si può realizzare con una struttura dati apposita. Ma lascio questo passo alle finiture successive.

All'inzio i dati verranno ottenuti in ordine sparso. Si può realizzare una chiamata del tipo GET /refresh da pollare una tantum, che vada ad azzerare tutti i contatori delle sottoscrizioni. Questo genererebbe il traffico che andrebbe ad alimentare LASTIN.

Idem cs: non capisco come pensi debba funzionare. puoi pf postare come ti immagini le chiamate/risposte partendo dal istante t0: avvio OH ?

thx

Di Maio, Dario

unread,
Mar 23, 2014, 3:04:57 PM3/23/14
to sou...@googlegroups.com

Nella mia idea la sintassi resta la stessa, già ora c'é un id in testa alla stringa. L'id c'é ma solo in testa alla stringa, ma non so se sia analizzabile con le regx, perché ora non usi quel dato.

La sintassi la possiamo modificare ovviamente, e cercherò l'occasione per spostare tutto lato wiznet e ridurre l'uso di RAM.

Credo di aver capito che sia necessaria una configurazione piú complessa. Per ora non preoccuparti della fase iniziale.

Dario.

From Mobile.

--

Fulvio Spelta

unread,
Mar 23, 2014, 3:51:21 PM3/23/14
to sou...@googlegroups.com

Nella mia idea la sintassi resta la stessa, già ora c'é un id in testa alla stringa. L'id c'é ma solo in testa alla stringa, ma non so se sia analizzabile con le regx, perché ora non usi quel dato.

Si oggi non lo uso perchè è più semplice basarsi solo sullo slot.
In caso di stringa con maggiori info sarà sufficiente rivedere la regex. Esempio
xml: <id1><s0>10</s0><s1>20</s1></id1>
regex
: .*<id1>.*<s1>(.*)</s1>.*</id1>
valore estratto
: 20

Se poi i valori venissero inviati uno alla volta allora sarebbe ancora più semplice:
xml: <id1><s1>20</s1></id1>
regex
: <id1><s1>(.*)</s1></id1>
valore estratto
: 20
 

La sintassi la possiamo modificare ovviamente, e cercherò l'occasione per spostare tutto lato wiznet e ridurre l'uso di RAM.

Tutto dipende da come devono essere utilizzate queste stringhe.
 

Credo di aver capito che sia necessaria una configurazione piú complessa. Per ora non preoccuparti della fase iniziale.

Continua a pensare che sia necessario un "vista" globale" ; non ho ancora capito come pensi di configurare OH.

Ciao

Fulvio Spelta

unread,
Mar 23, 2014, 3:56:03 PM3/23/14
to sou...@googlegroups.com
Ciao una cortesia per consentire il "mio" esperimento con l'invio broadcast delle variazioni.

Ho modificato il macaco.cpp per inserire l'invio di una pacchetto con sintassi:
<idnodo><idslot>valore</idslot></idnodo>

ad ogni ricezione di cambio stato.

Purtroppo non capisco dove reperire idslot e valore (serve anche il tipico per guidare la conversione del valore immagino); puoi cortesemente darmi una dritta?
In allegato il file modificato, trovi tutto cercando "fulvio" ho marchiato inizio e fine modifiche aggiunte.

thx
f

MaCaco.cpp

Di Maio, Dario

unread,
Mar 23, 2014, 3:59:32 PM3/23/14
to sou...@googlegroups.com

Ok, quindi la sintassi rimane quella attuale. Per la configurazione di OA non saprei dirti, sta a te trovare la strada giusta.

Parti dal presupposto che ci sia già il primo stato disponibile, poi quel punto andrà a posto da solo usando alcuni accorgimenti lato scheda.

Tanto MaCaco é dinamico e può essere forzato temporaneamente in una sorta di polling, quindi si recuperano tutte le informazioni che servono.

Dario.

From Mobile.

--

Di Maio, Dario

unread,
Mar 23, 2014, 4:01:08 PM3/23/14
to sou...@googlegroups.com

Domani ci guardo, il numero viene ricavato confrontando l'indirizzo vNet con la posizione in ADDRESSES.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 23, 2014, 4:24:40 PM3/23/14
to sou...@googlegroups.com

Ok, quindi la sintassi rimane quella attuale. Per la configurazione di OA non saprei dirti, sta a te trovare la strada giusta.

Quello che temo è che questa strada ci porti ad una configurazione complessa, senza peraltro darci grandi vantaggi rispetto al polling attuale (rimaniamo sempre in polling anche se ottimizzato). E' un vantaggio (la RAM) lato gw che però comporta una configurazione complessa la OH.

La configurazione "semplice" ovvero mantenere l'attuale (info di analisi a livello di item e nessuna rule) non sono affatto sicuro che funzioni con questa modalità di restituzione dei dati. E' da provare preventivamente. Cercherò di fare anche in questo caso una simulazione.

A mio avviso comunque la situazione la possiamo riassumere:
  1. Abbiamo una interfaccia funzionante in modalità http/polling (serve un gw con un po di ram se vuoi usarlo altrimenti puoi attivare l'interfaccia su ogni nodo). E' integrata in OH secondo lo "standard" con binding a livello di item. Direi che è una buona interfaccia.
  2. Stiamo provando a inserire sul punto 1 la restituzione dei dati solo se variati... da verificare la fattibilità e gli impatti sulla configurazione OH. Il vantaggio è confinato al risparmio della RAM su gw
  3. Sto provando la ricezione di eventi su canale UDP. Da valutare impatto su GW, percorso ancora immaturo per essere valutato seriamente, il vantaggio è avere una ricezione reale di eventi. L'impatto su configurazione OH può essere importante, magari sarà solo da documentare ed inserire ad hoc in alcuni sketch dove la necessità di rilevare un evento in tempo reale è davvero indispensabile.
  4. Realizzare il binding nativo.... lo so ci torno sempre, ma sono convinto che non sia difficile. Proposta: non potremmo creare un gdl finalizzato alla creazione, poi una volta "creato" posso prenderlo in carico.
ciao grazie
f


Di Maio, Dario

unread,
Mar 23, 2014, 4:49:35 PM3/23/14
to sou...@googlegroups.com

Concordo, ma l'attuale HTTP ha anche un problema di scalabilità su un numero elevato di nodi.
La nuova versione potrebbe portare a tempi di risposta veloci quanto su SoulissApp.

La RAM é un non problema, nel senso che si può lavorare per creare il buffer dinamicamente nel wiznet.

L'idea di usare UDP o un binding nativo sono interessanti, mi muovo in base ai tuoi riscontri.

Cosa intendi per gdl?

Dario.

From Mobile.

Message has been deleted

Fulvio Spelta

unread,
Mar 23, 2014, 8:38:42 PM3/23/14
to sou...@googlegroups.com
Test restituzione valori parziali - negativo

Visti risultati dei test precedenti me lo aspettavo, purtroppo la configurazione attuale non è compatibile con una restituzione parziale dei dati.

Codice utilizzato
import java.io.BufferedReader;
                    out.println("HTTP/1.1 200 OK");
                    out.println("Content-Type: text/plain");
                    out.println("");
                if (i < 5) {
                   out.println("<s1>10</s1><s2>20</s2>");
                   // out.println(i);
                   System.out.println("Inviato response");
               
                else {
                   out.println("<s2>20</s2>");
                   System.out.println("No response" + i);                
                }
                } finally {
                    socket.close();
                }
            }
        }
        finally {
            listener.close();
        }
    }
}

Items
String  LEDR     "T1 [%d]"  { http="<[http://192.168.10.110:9090/pippo.htm:2000:REGEX(.*<s1>(.*)</s1>.*)]" }
String  LEDG     "T2 [%d]"  { http="<[http://192.168.10.110:9090/pippo.htm:2000:REGEX(.*<s2>(.*)</s2>.*)]" }

Esito
01:29:20.214 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:20.236 INFO  runtime.busevents[:26] - LEDR state updated to 10
01:29:22.253 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:22.278 INFO  runtime.busevents[:26] - LEDR state updated to null
01:29:24.291 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:24.320 INFO  runtime.busevents[:26] - LEDR state updated to null
01:29:26.334 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:26.363 INFO  runtime.busevents[:26] - LEDR state updated to null
01:29:28.377 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:28.400 INFO  runtime.busevents[:26] - LEDR state updated to null

In sintesi quando vengono restituiti entrambi i valori s1 e s2 tutti ok se viene restuito uno solo dei due valori l'altro item finisce per essere impostato a null

A questo punto questa strada porta a una configurazione complessa la OH perché si dovrebbe ricorrere ad un item di appoggio ed a una regola di analisi.

gdl = gruppo di lavoro. La mia idea è che le persone che hanno le competenze contribuiscano realizzando una prima implementazione del binding (spero che dalla app o da zozzariello si riesca ad estrarre una serie di classi per la gestione del protocollo.

Potremmo aprire un post af hoc per progettare insieme la struttura del binding (io potrei proporre la struttura delle impostazioni ovvero come fare la configurazione in OH) e realizzare un prima versione collaborando tutti insieme, successivamente, una volta impostato, potrei prenderlo in carico per la manutenzione liberando i contributori e non caricandoli così a dismisura.

ciao
f

Di Maio, Dario

unread,
Mar 24, 2014, 4:06:22 AM3/24/14
to sou...@googlegroups.com

Alla luce di questo risultato, vale la pena continuare su questa strada per HTTP?

Creare un gruppo di lavoro é difficile, perché intorno a Souliss siamo sempre gli stessi.
L'unico ad avere competenze é Alessandro, ma non lavora piú in modo costante al progetto (almeno per ora) e piú di una volta gli ho chiesto di interessarsi ad openHAB.

Con l'attuale gruppo di persone abbiamo dei limiti nello sviluppo e nella manutenzione.
Servirebbe portare nuove persone e competenze, suggerimenti?

Dario.

From Mobile.

On 24 Mar 2014 01:36, "Fulvio Spelta" <fulvio...@gmail.com> wrote:
Test restituzione valori parziali - negativo

Visti risultati dei test precedenti me lo aspettavo, purtroppo la configurazione attuale non è compatibile con una restituzione parziale dei dati.

Codice utilizzato
import java.io.BufferedReader;
                    out.println("HTTP/1.1 200 OK");
                if (i < 5) {
                   out.println("Content-Type: text/plain");
                   out.println("");
                   out.println("<s1>10</s1><s2>20</s2>");
                   // out.println(i);
                   System.out.println("Inviato response");
               
                else {
                   System.out.println("No response" + i);                
                }
                } finally {
                    socket.close();
                }
            }
        }
        finally {
            listener.close();
        }
    }
}

Items
String  LEDR     "T1 [%d]"  { http="<[http://192.168.10.110:9090/pippo.htm:2000:REGEX(.*<s1>(.*)</s1>.*)]" }
String  LEDG     "T2 [%d]"  { http="<[http://192.168.10.110:9090/pippo.htm:2000:REGEX(.*<s2>(.*)</s2>.*)]" }

Esito
01:29:20.214 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:20.236 INFO  runtime.busevents[:26] - LEDR state updated to 10
01:29:22.253 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:22.278 INFO  runtime.busevents[:26] - LEDR state updated to null
01:29:24.291 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:24.320 INFO  runtime.busevents[:26] - LEDR state updated to null
01:29:26.334 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:26.363 INFO  runtime.busevents[:26] - LEDR state updated to null
01:29:28.377 INFO  runtime.busevents[:26] - LEDG state updated to 20
01:29:28.400 INFO  runtime.busevents[:26] - LEDR state updated to null

In sintesi quando vengono restituiti entrambi i valori s1 e s2 tutti ok se viene restuito uno solo dei due valori l'altro item finisce per essere impostato a null

A questo punto questa strada porta a una configurazione complessa la OH perché si dovrebbe ricorrere ad un item di appoggio ed a una regola di analisi.

gdl = gruppo di lavoro. La mia idea è che le persone che hanno le competenze contribuiscano realizzando una prima implementazione del binding (spero che dalla app o da zozzariello si riesca ad estrarre una serie di classi per la gestione del protocollo.

Potremmo aprire un post af hoc per progettare insieme la struttura del binding (io potrei proporre la struttura delle impostazioni ovvero come fare la configurazione in OH) e realizzare un prima versione collaborando tutti insieme, successivamente, una volta impostato, potrei prenderlo in carico per la manutenzione liberando i contributori e non caricandoli così a dismisura.

ciao
f

Fulvio Spelta

unread,
Mar 24, 2014, 5:06:38 AM3/24/14
to sou...@googlegroups.com

Alla luce di questo risultato, vale la pena continuare su questa strada per HTTP?

Non mi convince si complica la configurazione OH a fronte di un vantaggio che non riesco a percepire appieno
Il mio pensiero è che lavorando a livello di polling comunque impegno il binder OH e riduco solo il tempo di ricezione della risposta, non so valutare quanto possa avvantaggiarmi.

Per ora mi fermerei qui e proverei ad analizzare un po' meglio la strada del "broadcast" (anche se l'invio di info può essere mirato a OH non necessariamente un broadcast) in modo che almeno a fronte della complicazione della configurazione ottengo il vantaggio di ricevere info ad eventi. Questo comunque sgraverebbe "la rete" perchè il polling potrebbe essere ridotto a frequenze basse.

Su questo ti chiedo se riesci a darmi la dritta di cui all'altro post. Tieni presente ad integrazione che nel codice che ho postato manca il pezzetto di inserimento in buffer del valore dello slot perchè non sapendo dove trovare valore e tipo (per la gestione dei T5x) non ho inserito nulla.

Creare un gruppo di lavoro é difficile, perché intorno a Souliss siamo sempre gli stessi.
L'unico ad avere competenze é Alessandro, ma non lavora piú in modo costante al progetto (almeno per ora) e piú di una volta gli ho chiesto di interessarsi ad openHAB.

Con l'attuale gruppo di persone abbiamo dei limiti nello sviluppo e nella manutenzione.
Servirebbe portare nuove persone e competenze, suggerimenti?

La proposta che posso fare per avere una velocità di produzione del binder decente è questa: qualcuno (Alessandro?) mi da una mano a predisporre le classi di base per la gestione del protocollo, così intento io capsco qualcosa di più di java, e poi io provo a confezionare il binder vero e proprio. Spero che le classi di base siano "facilmente estraibili" dal lavoro già fatto per app e zozzariello, sarà vero ?

Ciao grazie
f

Di Maio, Dario

unread,
Mar 24, 2014, 5:08:46 AM3/24/14
to sou...@googlegroups.com

Dopo ci guardo.

Alessandro legge il forum, se vorrà si farà avanti.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 24, 2014, 5:50:40 AM3/24/14
to sou...@googlegroups.com
E con questo post prometto ad Alessandro di non citarlo più :-) e mi scuso se ho esagerato.
f


Fulvio Spelta

unread,
Mar 24, 2014, 6:43:03 AM3/24/14
to sou...@googlegroups.com
Ciao
provo a condividere a macro un parallelo funzionale fra app e binder OH.

App Database -> OH configuration
in OH lo ipotizzo come configurazione da fare in openhab.cfg. In pratica l'elenco dei nodi e degli slot e la loro natura li potremmo inserire nella configurazione di base. Da un punto di vista della implementazione dovrebbe essere analogo leggere la configurazione dal file rispetto a riceverla dalla rete e memorizzarla nel db della app.Altra info memorizzata è l'indirizzo del gw.


Items -> node/slot
Ogni items dovbrebbe avere come dati di configurazione in OH il riferimento al nodo e slot configurato nella configurazione globale. Il comportamento del binder mi aspetto che sia analogo a quello della app ovvero sottoscrivo il gw e alla ricezione dei dati (che sia la risposta alla sottoscrizione o la notifica di un evento) il binder traduce il valore souliss in stato OH secondo le regole della tabella che abbiamo pubblicato e aggiorna lo stato degli item. Mi sembra analogo a quanto fa la app.

Ciao

Di Maio, Dario

unread,
Mar 24, 2014, 9:44:55 AM3/24/14
to sou...@googlegroups.com

Conoscendolo non gli dispiace essere citato :) ma ultimamente trova modi migliori di impegnare le serate :D ...e fa bene! :D

Dario.

From Mobile.

On 24 Mar 2014 10:50, "Fulvio Spelta" <fulvio...@gmail.com> wrote:
E con questo post prometto ad Alessandro di non citarlo più :-) e mi scuso se ho esagerato.
f


Di Maio, Dario

unread,
Mar 24, 2014, 11:47:24 AM3/24/14
to sou...@googlegroups.com
Ho guardato alle tue modifiche, in quella pozione di codice dovresti avere accesso alla variabile nodeindex che rappresenta l'id del nodo per cui verranno trasmessi i dati. Ho provato a modificare il tuo codice, ora non tiene conto dei tipici, ma credo che al fine delle prove non sia importante.

Se le prove avranno successo, potremmo provare a realizzarne un'implementazione basata su LASTIN, creando un'interfaccia come per l'attuale HTTP/XML.

Una domanda, l'unica soluzione possibile è quella di utilizzare una struttura dati ASCII come XML? Lato openHAB riusciresti a fare il parsing di una struttura binaria come quella di MaCaco?

Saluti,
Dario.


MaCaco.cpp

Fulvio Spelta

unread,
Mar 24, 2014, 12:30:43 PM3/24/14
to sou...@googlegroups.com
Grazie, ho visto le tue modifiche ed ho notato che hai inserito la generazione della stringa xml completa di tutti gli slot del nodo.

E' possibile inserire solo il/i nodi che hanno ricevuto il valore aggiornato ?
 

Se le prove avranno successo, potremmo provare a realizzarne un'implementazione basata su LASTIN, creando un'interfaccia come per l'attuale HTTP/XML.
Quando mi dici queste cose non ti capisco :-( 
Per allineamento il modello di funzionamento che proverà è il seguente:
1) binding http/xml per tutti gli item (come ora) richiamato a frequenza bassa (es: 1 volta al minuto ma anche meno). Questo per acquisire il valore all'avvio di OH e per riallineamento ogni tanto
2) aggiornamento dello stato degli item ad evento trmite ricezione della notifica tramite questo codice (es: broadcast) e rule OH

ora facciamo i test poi eventualmente vediamo i dettagli di una eventuale implementazione ottimizzata.
 

Una domanda, l'unica soluzione possibile è quella di utilizzare una struttura dati ASCII come XML? Lato openHAB riusciresti a fare il parsing di una struttura binaria come quella di MaCaco?

Bella domanda non lo so devo studiare


Di Maio, Dario

unread,
Mar 24, 2014, 12:41:33 PM3/24/14
to sou...@googlegroups.com

Hai ragione é stata colpa della fretta, riesci comunque a fare le prove con questo codice?

I valori iniziali non sono un problema, fai conto che al primo avvio dell'interfaccia openHAB tutti i valori siano disponibili.
Per farti capire, SoulissApp non fa polling e nel gateway non c'é memoria degli altri nodi. Sono cose curate dal protocollo, ci pensa lui a chiedere per tuo conto i dati.

Dietro deve esserci un unico meccanismo ad eventi ed asincrono, poi ci saranno dei meccanismi d'innesco per casi particolari.
Lato openHAB ci vogliono solo le regole per catturare il frame e farne il parsing, queste devono essere assolutamente asincrone dal resto, altrimenti non é un meccanismo ad eventi.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 24, 2014, 12:52:37 PM3/24/14
to sou...@googlegroups.com


Il giorno lunedì 24 marzo 2014 17:41:33 UTC+1, Dario Di Maio ha scritto:

Hai ragione é stata colpa della fretta, riesci comunque a fare le prove con questo codice?

Si non c'è problema, di fatto è un caso particolare (tutti i nodi cambiati) ma la sostanza è sempre quella.
 

I valori iniziali non sono un problema, fai conto che al primo avvio dell'interfaccia openHAB tutti i valori siano disponibili.

Quindi è ipotizzabile una situazione tipo:
1) gli item OH non hanno alcuna informazione di recupero dello stato ma solo gli eventuali comandi 
2) lo stato degli item viene sempre e solo acquisito tramite il meccanismo di notifica di cui stiamo parlando
3) all'avvio OH manda un segnale (chiamata a specifica url o invio di una particolare insieme di byte tramite udp (magari ripetibile periodicamente) che richiede l'invio tramite il meccanismo di notifica dello stato di tutti gli item della rete souliss

In questo modo realizzeremmo qualcosa di simile al binding nativo (tutto ad eventi) solo più complicato perchè la gestione è esplicita in "codice OH" invece che annegata nel binding.


Per farti capire, SoulissApp non fa polling e nel gateway non c'é memoria degli altri nodi. Sono cose curate dal protocollo, ci pensa lui a chiedere per tuo conto i dati.

Detto così non capisco perchè c'è la modalità PERSISTENCE se il gw sarebbe in grado di recuperare on demand i dati a fronte della ricezione della url di richiesta -> prestazioni nella risposta ?
 

Di Maio, Dario

unread,
Mar 24, 2014, 1:02:30 PM3/24/14
to sou...@googlegroups.com

Si hai colto in pieno. É quello che fa SoulissApp. Si deve capire se vale la pena realizzarlo seguendo questa strada.

La modalità persistance serve solo come buffer di polling, se ogni richiesta di polling venisse trasformata in un evento, la comunicazione diventerebbe in polling e non piú ad eventi.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 24, 2014, 1:07:37 PM3/24/14
to sou...@googlegroups.com
Pare che la tua modifica funzioni. Riesci a darmi la dritta su come inserire il check del tipico che ho il T53 della temperatura che da i numeri del lotto ?

Questo è xml generato da più eventi di variazione:
<id1><s0>16</s0><s1>8</s1><s2>100</s2><s3>76</s3><s4>0</s4><s5>0</s5><s6>0</s6><s7>0</s7><s8>0</s8><s9>0</s9></id1><id1><s0>16</s0><s1>8</s1><s2>96</s2><s3>76</s3><s4>0</s4><s5>0</s5><s6>0</s6><s7>0</s7><s8>0</s8><s9>0</s9></id1><id1><s0>16</s0><s1>8</s1><s2>92</s2><s3>76</s3><s4>0</s4><s5>0</s5><s6>0</s6><s7>0</s7><s8>0</s8><s9>0</s9></id1>


Di Maio, Dario

unread,
Mar 24, 2014, 1:10:40 PM3/24/14
to sou...@googlegroups.com

Guarda al codice dell'interfaccia é li dentro, lo riconosci.

Se mi dai l'ok, scrivo un interfaccia completa come ci siamo detti.

Dario.

From Mobile.

Fulvio Spelta

unread,
Mar 24, 2014, 1:10:52 PM3/24/14
to sou...@googlegroups.com
Se può aiutarti
codice interfaccia OH
// Typicals in group Souliss_T5n need convertion from half-precision float to string
if((memory_map[MaCaco_G_TYP_s+(id_for*MaCaco_TYPLENGHT)+slot] & 0xF0 ) == Souliss_T5n)
{
float f_val;
float32((U16*)(memory_map+(MaCaco_G_OUT_s+(id_for*MaCaco_OUTLENGHT)+slot)), &f_val);
ASCII_float2str((float)f_val, 2, &buf[bufferlen], HTTP_BUFBYTES);
bufferlen = strlen(buf); 
else // All others values are stored as unsigned byte
{
// Print "val" value
*(unsigned long*)(buf+bufferlen) = (unsigned long)memory_map[MaCaco_G_OUT_s+(id_for*MaCaco_OUTLENGHT)+slot];
ASCII_num2str((uint8_t*)(buf+bufferlen), DEC, &bufferlen);
}

codice dell'inserimento del "val" in macaco
// Print "val" value
*(unsigned long*)(buf+bufferlen) = (unsigned long)memory_map[MaCaco_P_OUT_s+(nodeindex*MaCaco_OUTLENGHT)+sslot];
ASCII_num2str((uint8_t*)(buf+bufferlen), DEC, &bufferlen);  

thx

Di Maio, Dario

unread,
Mar 24, 2014, 1:13:50 PM3/24/14
to sou...@googlegroups.com

?

From Mobile.

Di Maio, Dario

unread,
Mar 24, 2014, 1:22:35 PM3/24/14
to sou...@googlegroups.com

Ti serve una mano ad integrarlo? O l'hai riportato solo per informazione?

From Mobile.

Fulvio Spelta

unread,
Mar 24, 2014, 1:31:50 PM3/24/14
to sou...@googlegroups.com
Serve una mano le costanti non mi tornano e quindi non so quali utilizzare per recuperare il tipico.

macaco
*(unsigned long*)(buf+bufferlen) = (unsigned long)memory_map[MaCaco_P_OUT_s+(nodeindex*MaCaco_OUTLENGHT)+sslot];

openhab

Fulvio Spelta

unread,
Mar 24, 2014, 1:56:27 PM3/24/14
to sou...@googlegroups.com
Fatto !!!!! Sono andato per analogia, sei stato congruente !! sta andando a stanotte per le prove di acquisizione lato OH (se resisto)

Fulvio Spelta

unread,
Mar 24, 2014, 6:23:49 PM3/24/14
to sou...@googlegroups.com
Ciao putroppo qualcos ano va nella generazione dell'xml.

Quando scatta un evento genera una sequenza che è
<id1><s0>16</s0><s1>8</s1><s2>25.25</s2><s3>78</s3><s4>0</s4><s5>0</s5><s6>0</s6><s7>0</s7><s8>0</s8><s9>0</s9></id1>

come se ci fosse un nodo 1 con 10 slot mentre la rete souliss vi sono 2 nodi:
<id0><s0>1</s0><s1>0</s1><s2>0</s2><s3>0</s3><s4>0</s4></id0>
<id1><s0>16</s0><s1>8</s1><s2>25.44</s2><s3>78</s3></id1>

Faccio comunque qualche prova basandomi sul nodo 1
f

Di Maio, Dario

unread,
Mar 24, 2014, 7:01:14 PM3/24/14
to sou...@googlegroups.com

Non é sbagliato, quella porzione di codice funziona solo per i nodi remoti.

Spero sia sufficiente per effettuare una valutazione, poi le prove le facciamo sul codice  reale dell'interfaccia.

Fammi sapere,
Dario

From Mobile.

On 24 Mar 2014 18:56, "Fulvio Spelta" <fulvio...@gmail.com> wrote:
Fatto !!!!! Sono andato per analogia, sei stato congruente !! sta andando a stanotte per le prove di acquisizione lato OH (se resisto)

Fulvio Spelta

unread,
Mar 24, 2014, 7:41:37 PM3/24/14
to sou...@googlegroups.com
https://groups.google.com/forum/#!topic/openhab/qLfhvRFQO0I
speriamo altrimenti il codice della rule si complica

Fulvio Spelta

unread,
Mar 25, 2014, 1:27:14 PM3/25/14
to sou...@googlegroups.com
Funziona. Caso di test:

Items
String sUDP50 "sUDP50" { udp="<[*:*:REGEX((.*))]" }
String sTest "Test [%s]"

Rules
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.*
import java.util.regex.Matcher
import java.util.regex.Pattern

var String sExpr = "<id1>.*<s2>(.*)</s2>.*"

rule "Extract status from broadcasted data"
when
    Item sUDP50 changed
then
var String sAppo = ""
sAppo = sUDP50.state.toString
logInfo( "FILE", sExpr )
logInfo( "FILE", sAppo )

var Pattern pattern = Pattern::compile(sExpr)
var Matcher matcher = pattern.matcher(sAppo)
matcher.find()
logInfo( "FILE", matcher.group(1) )
postUpdate(sTest, matcher.group(1) )
end

Alla ricezione dell'xml a fronte dell'evento viene eseguita la regola, estratto il valore dello slot 2 (temperatura) e impostato come stato all'item sTest.
L'aggiornamento è praticamente in tempo reale.

ciao
f

Di Maio, Dario

unread,
Mar 25, 2014, 7:12:55 PM3/25/14
to sou...@googlegroups.com

Complicato :)

Devi impostare una regola per ogni item? C'é un modo per creare delle regole di template?

Come stai lavorando su UDP (broadcast/unicast, porta, ip).?

Dario

From Mobile.

--

Fulvio Spelta

unread,
Mar 25, 2014, 7:57:37 PM3/25/14
to sou...@googlegroups.com


Il giorno mercoledì 26 marzo 2014 00:12:55 UTC+1, Dario Di Maio ha scritto:

Complicato :)

Devi impostare una regola per ogni item? C'é un modo per creare delle regole di template?

No una sola regola legata all'item buffer nella quale verificare tutte le estrazioni direi per il nodo che ha mandato i dati aggiornati
 

Come stai lavorando su UDP (broadcast/unicast, porta, ip).?

Ora souliss manda in broadcast X.X.X.255:25002 (la porta si imposta nella configurazione di OH)

Studio ancora un po e poi se funziona posto il caso completo relativo al mio nodo "tapparelle".

ciao

Di Maio, Dario

unread,
Mar 25, 2014, 7:59:26 PM3/25/14
to sou...@googlegroups.com

Verifica se funziona anche in unicast pur su una porta fissa.

Dario.

From Mobile.

--

Fulvio Spelta

unread,
Mar 26, 2014, 3:13:30 PM3/26/14
to sou...@googlegroups.com
Ciao, caso completo. Ho reso ad eventi la ricezione stati per il mio nodo "tapparelle".

Items
String sUDP50 "sUDP50" { udp="<[*:*:REGEX((.*))]" }
Number SOULISS_SL_1 "Light 1 [MAP(f_bin2switch.map):%d]"    <switch> { http="<[soulissnode90gw:2000:REGEX(.*<s4>(.*)</s4>.*)] >[1:GET:http://192.168.10.90/force?id=0&slot=4&val=2] >[0:GET:http://192.168.10.90/force?id=0&slot=4&val=4]", autoupdate="false" }
Switch SOULISS_SL_2 "Light 2 "    <switch> { http="<[soulissnode90gw:2000:REGEX(.*<s4>(.*)</s4>.*)] >[ON:GET:http://192.168.10.90/force?id=0&slot=4&val=2] >[OFF:GET:http://192.168.10.90/force?id=0&slot=4&val=4]", autoupdate="false" }
Number Weather_Temperature "Temperature [%.1f °C]" <temperature> (Weather_Chart, Weather_Temperature_Single)
Nota: gli item di comando sono legati al binding http solo per inviare comandi a souliss; l'item sUDP50 è l'item di appoggio ("buffer") di ricezione degli xml di notifica via udp (ora inviati in broadcast).

Rule per acquisizione stato
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.*
import java.util.regex.Matcher
import java.util.regex.Pattern

var String sRegxSOULISS_T1_tx = "<id1>.*<s0>(.*)</s0>.*"
var String sRegxSOULISS_T2_tx = "<id1>.*<s1>(.*)</s1>.*"
var String sRegxWeather_Temperature = "<id1>.*<s2>(.*)</s2>.*"

rule "Extract status from broadcasted data"
when
    Item sUDP50 changed
then
var String sAppo = ""
sAppo = sUDP50.state.toString

var Pattern pattern = Pattern::compile(sRegxSOULISS_T1_tx)
var Matcher matcher = pattern.matcher(sAppo)
matcher.find()
postUpdate(SOULISS_T1_tx, matcher.group(1))

pattern = Pattern::compile(sRegxSOULISS_T2_tx)
matcher = pattern.matcher(sAppo)
matcher.find()
postUpdate(SOULISS_T2_tx, matcher.group(1))

pattern = Pattern::compile(sRegxWeather_Temperature)
matcher = pattern.matcher(sAppo)
matcher.find()
postUpdate(Weather_Temperature, Float::parseFloat(matcher.group(1)))
end

Il tutto funziona egregiamente e il cambio stato dell'item a fronte dell'invio di un comando è veramente immediato. Non semplicissimo ma molto bello funzionalmente.

Ciao

Marco Fabbri

unread,
Mar 31, 2014, 7:31:27 AM3/31/14
to sou...@googlegroups.com
scusa ma così lo stato non lo legge attraverso http?

Di Maio, Dario

unread,
Mar 31, 2014, 7:33:25 AM3/31/14
to sou...@googlegroups.com
Adesso Fulvio sta usando un codice ibrido, dove gira la classica interfaccia HTTP/XML ed in più ad ogni evento viene generato un pacchetto UDP contenente la stessa sintassi XML.

L'idea è quella di rimuovere l'uso di TCP ed HTTP, inviando anche i comandi su UDP con il classico formato di una URL HTTP.

Dario.


On Mon, Mar 31, 2014 at 1:31 PM, Marco Fabbri <marc...@gmail.com> wrote:
scusa ma così lo stato non lo legge attraverso http?

{ http="<[soulissnode90gw:2000:REGEX(.*<s4>(.*)</s4>.*)]

Fulvio Spelta

unread,
Apr 8, 2014, 12:44:23 PM4/8/14
to sou...@googlegroups.com
Ciao, una piccola consulenza. Attualmente sti utilizzando sul GW il macaco.cpp che abbiamo modificato insieme (allegato), ma questa modifica invia l'xml soloquando c'è una variazione di uno slot di un peer e non invia nulla se varia uno slot del GW stesso.

E' possobile intervenire (qui o altrove) in modo che l'xml dell'evento venga inviato per qualsiasi nodo che subisca una modifica sia su un nodo peer che sul GW?

grazie e ciao
MaCaco.cpp

Di Maio, Dario

unread,
Apr 8, 2014, 2:54:42 PM4/8/14
to sou...@googlegroups.com

Ciao Fulvio,

Intervenire su quel file é un po complesso ma non impossibile. Se sei sufficientemente assestato in questa modalità, ti chiederei di passare ad usare la A5.2 che ti ho inviato qualche settimana fa.

Dovrebbe inviare anche i dati relativi al nodo locale.

In questo modo valutiamo il comportamento del codice che verrà effettivamente rilasciato.

Fammi sapere,
Dario.

From Mobile.

--

Fulvio Spelta

unread,
Apr 9, 2014, 3:46:16 AM4/9/14
to sou...@googlegroups.com
Devo apportare modifiche alla 5.2 o la devo utilizzare così come me la hai inviata ?

Di Maio, Dario

unread,
Apr 9, 2014, 4:00:12 AM4/9/14
to sou...@googlegroups.com
Ho inviato sul forum la release da utilizzare, spero funzioni correttamente.

Dario.


On Wed, Apr 9, 2014 at 9:46 AM, Fulvio Spelta <fulvio...@gmail.com> wrote:
Devo apportare modifiche alla 5.2 o la devo utilizzare così come me la hai inviata ?

Di Maio, Dario

unread,
Apr 14, 2014, 2:55:19 PM4/14/14
to sou...@googlegroups.com

A memoria, il tuo nodo gateway non usa solo il tipico di indicazione On/Off senza comandi?
Se si, il comportamento é corretto perché la logica non processa i comandi e quindi non vengono generati eventi.

Dario.

From Mobile.

On 14 Apr 2014 17:09, "Fulvio Spelta" <fulvio...@gmail.com> wrote:
Intanto provo ciao f


2014-04-14 17:06 GMT+02:00 Di Maio, Dario <dario....@souliss.net>:
Riusciresti a mandarmi un file?


2014-04-14 13:43 GMT+02:00 Fulvio Spelta <fulvio...@gmail.com>:
Fatto ti ho messo un caso semplice nella nota (start/status/gw on)

ciao
f


2014-04-14 13:32 GMT+02:00 Di Maio, Dario <dario....@souliss.net>:
Nel fare le prove, attiva il debug su MaCaco/vNet così vediamo come il comando viene tradotto e se c'è qualcosa che non torna.

Dario.


2014-04-14 13:27 GMT+02:00 Fulvio Spelta <fulvio...@gmail.com>:
Forse trovate un buchino: sembra non ricevere i comandi per id=0, vedi la nota l'ho aggiornata. ciao f


2014-04-14 13:18 GMT+02:00 Fulvio Spelta <fulvio...@gmail.com>:
Ciao
ho fatto qualche prova preliminare e sembra molto ok, vedi al link

Domani cercherò di fissare la configurazione OH.

Diventa importante il tema della conversione dei valori analogici: è affrontabile ?

P.S.
Posto anche un feedback positivo per tenere su il morale. :-)

ciao
f


2014-04-14 11:28 GMT+02:00 Di Maio, Dario <dario....@souliss.net>:
Non l'avevo resa pubblica :(

Trovi al link la RC0

Dario.


2014-04-14 10:59 GMT+02:00 Fulvio Spelta <fulvio...@gmail.com>:
Sono imbranato non trovo la R4... help


2014-04-13 18:47 GMT+02:00 Di Maio, Dario <dario....@souliss.net>:

Nel topic dedicato ho pubblicato la versione n4 che risolve il problema di cui parlavi.

Adesso per ogni GET /status avviene il reset di tutti i canali di sottoscrizione, quindi in sequenza arrivano dati da tutti i nodi.

Da openHAB devi fare un polling lento della /status (molto lento) e considerare che viene presa traccia dell'ultimo ip da cui si riceve una /status, /force o /typ.

Se hai tempo, prova a modificare il codice per produrre un frame per ogni slot. Se i tempi di risposta sono accettabili (per 50 slot) possiamo procedere in quel modo.

Lato openHAB la configurazione é complessa?

Dario.

From Mobile.









Fulvio Spelta

unread,
Apr 14, 2014, 9:09:59 PM4/14/14
to sou...@googlegroups.com
Ciao
sembtra che stia funzionando con queste semplici configurazioni OH

items
Number SOULISS_T1_tx "Tapparella 1 [MAP(f_T22_map.map):%d]"    <fsrollershutter> { udp="<[*:*:REGEX(<id1>.*<s0>(.*)</s0>.*)], >[*:192.168.10.90:290:'REGEX(/force?id=1&slot=0&val=(.*))']" }
Number SOULISS_T2_tx "Tapparella 1 [MAP(f_T22_map.map):%d]"    <fsrollershutter> { udp="<[*:*:REGEX(<id1>.*<s1>(.*)</s1>.*)], >[*:192.168.10.90:290:'REGEX(/force?id=1&slot=1&val=(.*))']" }
Number Weather_Temperature "Temperature [%.1f °C]" <temperature>  { udp="<[*:*:REGEX(<id1>.*<s2>(.*)</s2>.*)]" }
Number PIR_1 "PIR_1 [%.1f]" <contact> (PIR) { udp="<[*:*:REGEX(<id0>.*<s0>(.*)</s0>.*)]" }

Dalle prime prove sembra anche che sia molto veloce ad acquisire i cambi stato.

Occorre uno stress test e la trascodifica decimale degli analogici

ciao
f

Di Maio, Dario

unread,
Apr 15, 2014, 1:46:43 AM4/15/14
to sou...@googlegroups.com

Devi comunque usare la modalità per mantenere memoria dell'ultima stringa ricevuta?

Come al solito di chiederò di documentare sul wiki la configurazione. Inoltre c'é da pensare se dismettere l'interfaccia HTTP per l'uso con openHAB e lasciarla come generica.

Dario.

From Mobile.

Marco Fabbri

unread,
Apr 15, 2014, 2:25:50 AM4/15/14
to sou...@googlegroups.com
Bravo Fulvio! Quindi in questo modo ricevi lo stato e lo puoi forzare tutto tramite udp. Dario se vuoi provo ad aggiornare l'esempio http in udp.

Fulvio Spelta

unread,
Apr 15, 2014, 2:32:10 AM4/15/14
to sou...@googlegroups.com
Ciao
ho ripristinato la configurazione completa a supporto degli sketch che abbiamo condiviso e ti confermo che funziona alla grande e l'interfaccia è molto responsive;

Punti aperti
  1. trascodifica degli analogici - Dario
  2. Stress & Type tests - Fulvio: considerato la "novità" della interfaccia (a beneficio di tutti resa possibile in questa forma dal rilascio 1.4 di OH che ha completamente ricostruito in termini funzionali il tcp/udp binding) propongo di procedere ad un test estensivo della configurazione realizzando e provando le configurazioni di riferimento per i tipici "fondamentali" o almeno che io consoco :-) (tapparelle, luci on/off, led strip, temnperatura)
  3. Analisi con revisione o conferma dei messaggi utilizzati (es: la sintassi /status, /force... può essere modificata a beneficio sia della semplifictà di configurazione OH e di un alleggerimento del codice? ) - Dario/Fulvio
  4. Analisi e decisione su finalità della interfaccia http
@Marco: aspetterei un attimo la fine della scaletta sopra proposta

@Tutti: ho inserito in scaletta i nomi per condividere con Dario chi si occupa di cosa, ma ovviamente ogni contributo/commento/test/suggerimento ecc ecc è assolutamente graditissimo.

ciao
f

Fulvio Spelta

unread,
Apr 15, 2014, 2:34:43 AM4/15/14
to sou...@googlegroups.com
Dimenticavo:

Devi comunque usare la modalità per mantenere memoria dell'ultima stringa ricevuta?

No la configurazione del binding OH è pulita nativa senza "trucchi" di supporto, per questo propongo un test estensivo sia in termini funzionali di di copertura dei tipici, sembra troppo bello per essere vero! 

Quindi: gesti scaramantici a manetta e prove estensive.

:-)

Di Maio, Dario

unread,
Apr 15, 2014, 4:03:21 AM4/15/14
to sou...@googlegroups.com
Parli della configurazione lato openHAB o lato Souliss? Lato Souliss lo sketch è lo stesso sia in HTTP, sia in UDP.

Dario.


Di Maio, Dario

unread,
Apr 15, 2014, 4:05:08 AM4/15/14
to sou...@googlegroups.com
Vediamo se ho capito, dalla versione 1.4 hanno migliorato il binding TCP/UDP e quindi adesso è molto semplice riuscire ad effettuare l'integrazione. E' così?

Dario.


--

Fulvio Spelta

unread,
Apr 15, 2014, 6:11:32 AM4/15/14
to sou...@googlegroups.com

Vediamo se ho capito, dalla versione 1.4 hanno migliorato il binding TCP/UDP e quindi adesso è molto semplice riuscire ad effettuare l'integrazione. E' così?
 
Esatto, diciamo che il binding TCP/UDP della 1.4 ha funzionalità che potrebbero (voglio stare coi piedi per terra fino a che non abbiamo verificato tutto) portare alla realizzazione di una interfaccia OH<->souliss "semplice" e con supporto alla ricezione asincrona di eventi.

Approfitto per un aggiornamento: teniamo bene strette le mani sul volante: guardando con attenzione feedback "visivi" e passaggio veloce sui log ci sono cose che non mi tornano, confermo che è necessario un dettagliato approfondimento/verifica.

Se stanotte non crollo ci lavoro un po' :-)

f

Di Maio, Dario

unread,
Apr 15, 2014, 7:30:22 AM4/15/14
to sou...@googlegroups.com
L'importante è che la struttura stia in piedi e che si ricevano i dati, poi se c'è da affinare qualcosa ci lavoriamo.

Dario.


--

Fulvio Spelta

unread,
Apr 15, 2014, 9:11:53 AM4/15/14
to sou...@googlegroups.com
L'importante è che la struttura stia in piedi e che si ricevano i dati, poi se c'è da affinare qualcosa ci lavoriamo.
Certo che si, la mia preoccupazione è più rivolta  al comportamento del binder e della sua configurazione per arrivare ad un assetto semplice ed efficace.
Putroppo il binder è nuovo e la documentazione meno che scarsa, le sintassi quasi le "intuisco" più che leggere delle indicazioni, ma soprattutto il comportamento del binder e le sue potenzialità sono tutte da scoprire.

Sarà necessario un po' di tempo e pazienza, ma il potenziale è alto, quindi teniamo fisso l'obiettivo.

ciao
f

Di Maio, Dario

unread,
Apr 17, 2014, 11:32:06 AM4/17/14
to sou...@googlegroups.com

C'é un altro problema, questa modalità operativa richiede meno RAM ma ne richiede comunque troppa per i miei gusti.

Considerando i valori standard di 45 nodi e 24 slot introdotti con la A5 i consumi statici di RAM sono:
- PESISTANCE INTERFACE (polling) 2046 bytes
- LASTIN INTERFACE (event driven) 623 bytes

Nel secondo caso uno sketch richiede complessivamente l'82% di RAM con W5100/W5200 su Atmega328 (Arduino Uno) e non riuscirebbe a rientrarci con ENC28J60 per via dello stack IP in software.

Dei 623 byte, 358 sono usati per creare il frame XML da spedire e sono oggettivamente tanti. Dobbiamo cercare una formattazione piú leggera o una soluzione diversa (dividere in piú frame).

Sono ben accetti suggerimenti.

Dario.

From Mobile.

--

Di Maio, Dario

unread,
Apr 17, 2014, 1:19:11 PM4/17/14
to sou...@googlegroups.com

Un'altra considerazione, openHAB ha un binding Modbus.

Modbus é un protocollo in polling, come lo era quello realizzato con il binding HTTP, ma é binario e non ASCII.

Se riuscissimo a fare un mix per passare ad una formattazione binaria (libera e non legata a MaCaco) riusciremmo a chiudere il giro.

Dario.

From Mobile.

Fulvio Spelta

unread,
Apr 18, 2014, 6:08:42 AM4/18/14
to sou...@googlegroups.com
Ciao commento per punti:
  • "peso": sono d'accordo e credo ci sia spazio per una ottimizzazione del formato del dialogo. Su questo tema credo che sarebbe utile un confronto aperto per analizzare come ri-formulare il protocollo in funzione anche delle caratteristiche del binding UDP che ho scoperto ha qualche "caratteristica" non propriamente comoda per il ns contesto. Proverò a postare una richiesta di commenti su forum OH (anche se vedo che sull'argomento non piovono proprio risposte, forse sono io che non so scrivere in maniera interessante).
  • utilizzo del modbus: non conosco e quindi non voglio addentrarmi, unico commento è che se è in polling rischiamo di trovarci con i "limiti" dell'http, quali sarebbero i vantaggi,a parte,se ho capito bene il minor peso ?

Fulvio Spelta

unread,
Apr 18, 2014, 6:37:11 AM4/18/14
to sou...@googlegroups.com
Avanzamento test

Ho scoperto purtroppo che il binding tcp/udp ha un comportamento (credo by design) che non aiuta la ns integrazione. In sintesi, se lavoro singolarmente sulle direzioni (in/out) funziona tutto abbastanza bene, esempio:

Number SOULISS_T1_tx "Tapparella 1 [MAP(f_T22_map.map):%d]"    { udp="<[*:*:REGEX(<id1>.*<s0>(.*)</s0>.*)]" }
Riceve perfettamente l'aggiornamento dello stato dal tipico in modalità ad eventi (sinceramente funziona che è una meraviglia).

Number SOULISS_T1_tx "Tapparella 1 [MAP(f_T22_map.map):%d]"    { udp=">[1:192.168.10.110:290:'MAP(f_T22_udp_map.map')]" }

File f_T22_udp_map.map
1=GET /force?id=1&slot=0&val=1 
2=GET /force?id=1&slot=0&val=2
4=GET /force?id=1&slot=0&val=4

Anche se la modalità di configurazione non è proprio "comodissima" perchè devo utilizzare un map file per ogni item anche in questo caso funziona perfettamente ed ad ogni azionamento dell'interfaccia viene inviato il corretto comando.

Il problema si presenta se si configura un tipico con entrambe le definizioni perchè il binding "mischia" i canali IN/OUT e, non capisco con quale logica, applica le funzioni di trasformazione (vi risparmio i log che hanno accompagnato gli incubi delle miei ultime notti :-) ).

Abbiamo credo qualche alternativa:
  1. proseguire l'analisi del binding UDP sperando anche in qualche feedback dalla community OH
  2. provare a predisporre un protocollo che utilizzando le caratteristiche del binding renda possibile l'aggancio
  3. modbus ?
  4. partire dal sorgente del binding (ed ho visto che ne hanno pubblicato un altro chiamato "simpletcp") per realizzare il binding nativo souliss
Domanda: qualcun altro sta facendo prove analoghe ?

ciao
f


Di Maio, Dario

unread,
Apr 18, 2014, 8:46:02 AM4/18/14
to sou...@googlegroups.com
Non voglio usare il Modbus, che non è più supportato in Souliss, ma solo capire se esistano metodi per fare il parsing del binario a livello di configurazione.

Dario.


Fulvio Spelta

unread,
Apr 18, 2014, 8:58:46 AM4/18/14
to sou...@googlegroups.com
Ciao

Speriamo che ci sia qualche risposta. Se credi aggiungi pure altri dettagli o precisazioni. thx

Fulvio Spelta

unread,
Apr 18, 2014, 9:03:22 AM4/18/14
to sou...@googlegroups.com
Sul formato binario, a meno di non scrivere il binding, la vedo molto dura, possiamo pensare ad un binario "ascizzato" per ridurre al minimo overhead, ma dobbiamo prima verificare bene a tavolino la configurazione lato OH per essere sicuri di non avere "ambiguità". Su questo tema ho visto che usando packetsender ed un po' di pazienza si arriva a simulare piccoli pezzi di protocollo testando sul campo le idee senza dover sviluppare.

Quanto al tema "configurazione", se lo intendi come "configurazione automatica" alla souliss app al momento non ho abbastanza conoscenze per dire se sia fattibile o meno, propenderei per il meno ma è solo una sensazione non supportata da alcuna verifica.

f

Marco Fabbri

unread,
Apr 18, 2014, 9:26:12 AM4/18/14
to sou...@googlegroups.com
Fulvio vorrei provare a replicare qualche tua prova, ma ti chiedo se riesci a postare in uno zip gli scketch dei nodi e la cartella configuration di openhab.
Stai ancora usando un mega come gateway e una dino2 come per? Adesso riuscirei a replicare la tua configurazione.
Il gateway ancora deve essere un mega sia con UDP?
Sicuramente la configurazione con openhab e meno userfriendly rispetto a Soulissapp. Con un po di materiale, magari si rende più semplice effettuare alcune prove e magari darti qualche suggerimento su come aggirare l'ostacolo

Fulvio Spelta

unread,
Apr 18, 2014, 11:32:48 AM4/18/14
to sou...@googlegroups.com
Fulvio vorrei provare a replicare qualche tua prova, ma ti chiedo se riesci a postare in uno zip gli scketch dei nodi e la cartella configuration di openhab.
tutto allegato. Unico addon presente il binding tcp.
 
Stai ancora usando un mega come gateway e una dino2 come per? Adesso riuscirei a replicare la tua configurazione.
Esatto
 
Il gateway ancora deve essere un mega sia con UDP?
Diminuendo il numero di nodi e slot in macacocfg.h (5 nodi, 10 slot) girava anche su arduino uno + eth shield ma poi ho ripristinato il mega ed utilizzo quello così ho spazio sia ram che programa per attivare il debug su seriale
 
Sicuramente la configurazione con openhab e meno userfriendly rispetto a Soulissapp. Con un po di materiale, magari si rende più semplice effettuare alcune prove e magari darti qualche suggerimento su come aggirare l'ostacolo
 openahb a la app sono cose diverse il grande vantaggio di openahb è riuscire a fare una integrazione fra n tipi di dispositivi su una interfaccia unica + memorizzazione dei dati + grafici + connessione a servizi esterni es open.sen.se del tutto integrato. Anche in questo caso io vedo OH come complementare a souliss. Con spuliss realizzo appliance a basso costo alternative alle più costose appliance di marca come quelle knx o modbus; con openhab integro il tutto in uno "scada" di supervisione. Ognuno il massimo nel proprio campo!

Grazie per il supporto a presto ritrovarci.
f
configurations.zip
OA_tst_Peer_v0.ino
OA_tst_Gateway_v0_PIR.ino

Fulvio Spelta

unread,
Apr 18, 2014, 4:00:34 PM4/18/14
to sou...@googlegroups.com
Dario ho la necessita di fare una prova nella quale souliss riceva i comandi su una porta (ok la 290) ma trasmetta da un'altra (es:291 ma una qualsiasi va bene basta chenon sia ancora la 290).

E' un problema ? Riescia postarmi un file modificato o darmi le dritte per provvedere da solo ?

grazie 1K

Di Maio, Dario

unread,
Apr 18, 2014, 7:27:18 PM4/18/14
to sou...@googlegroups.com
Ciao Fulvio,

è già così, in ascolto c'è la porta 290 ed in scrittura la 29000 entrambe sono definite nel file openHAB.h contenuto nella cartella interfaces. Considera che a rigore, la porta di scrittura (29000) non andrebbe definita ma si dovrebbe usare la porta sorgente utilizzata dal client.

Qual'è il tuo problema?

Saluti,
Dario.


--

Fulvio Spelta

unread,
Apr 19, 2014, 4:38:23 AM4/19/14
to sou...@googlegroups.com
Non mi sono spiegato bene la porta 29000 (ora 2900) è la porta target del sistema ricevente ma la porta su souliss dalla quale mandi i dati è sempre la 290.

La prova che devo fare è che souliss utilizzi 2 porte una per ricevere e una diversa per restituire i dati a OH.

Stanotte sono riuscito a modificare l'interfaccia per avere questa caratteristica utilizzando il socket 0 che, poichè non utilizzo il protocollo RAW, ho capito che era libero.

La prova deriva dal fatto che il binding TCP/UDP di OH quando manda un comando poi si mette in ascolto per msg inviati dallo stesso IP/porta cui ha inviato il msg per processarlo ma utilizzando la stessa transofrmation che ha utilizzato per generare il msg di comando. Nel ns caso non può proprio funzionare.

Ho notato invece che se la sorgente del msg non coincide con IP/Porta cui è stato inviato il msg di comando allora lo analizza secondo le regole dei canali di input.

Per questo ho disgiunto la portedi ricezione da quella di trasmissione, per passare dal simulatore al lab con souliss.

Sto approntando lo stress test, poi aggiorno.

P.S.
Nel caso OH non vale la regola di rispondere su IP/Porta che cha inviato il msg perchè il binder spedisce msg da una porta random e invece sta in ascolto su una porta fissa configurabile nel openhab.cfg

Ciao
f

Di Maio, Dario

unread,
Apr 19, 2014, 7:17:22 AM4/19/14
to sou...@googlegroups.com
Parli di porta sorgente o porta di destinazione, il ragionamento non mi è molto chiaro.

Souliss deve inviare (porta di destinazione) laddove openHAB è in ascolto (2900) e non può inviare su porta diverse.

Credo di aver perso qualche pezzo.

Dario.

Fulvio Spelta

unread,
Apr 19, 2014, 11:26:09 AM4/19/14
to sou...@googlegroups.com
Devi tenere presente che ildialogo avviene sempre fra 2 sockets uno trasmittente e uno ricevente.

In sintesi souliss inversione originale gestisce le connessioni così:
porta openhab porta souliss
xxxx ---> 290
2900 <--- 290

mentre dopo la modifica le gestisce così:
porta openhab porta souliss
xxxx ---> 290
2900 <--- 291

Purtroppo comunque non è stato risolutivo, il binding tcp/udp ha comportamenti strani e vedo che purtroppo non giungono risposte dal forum OH :-((

Ora posto un altro caso puntuale (non capisco come funzioni 'sto binding e non trovo alcuna documentazione)
f

Di Maio, Dario

unread,
Apr 19, 2014, 11:38:35 AM4/19/14
to sou...@googlegroups.com

Capisco, la porta sorgente lato Souliss non credo abbia importanza ma nel caso lo si potrebbe gestire senza usare una nuova socket.

Credo che vada cercato l'autore del binding per arrivare ad una risposta.

Dario.

From Mobile.

Fulvio Spelta

unread,
Apr 20, 2014, 6:48:57 AM4/20/14
to sou...@googlegroups.com
Ciao a tutti un aggiornamento.

Dopo varie notti e test sono arrivato a 2 diversi stati di avanzamento:
  • Identificazione di una configurazione semplice del binding tcp/udp: brancolo nel buoi, anzi il sentore è che non ci sia; ho postato più volte domande ed esempi di comportamenti non proprio lineari del binding sui forum OH ma nessuna risposta. Sono un pelo basito, perchè il binding è, a mio avviso, strutturalmente molto interessante e di potenziale però ha comportamenti che non capisco se siano bug o by design che lo rendono un po' ingessato. Se siete curiosi guardate i forum OH e troverete 3 miei msg di cui uno con 3 esempi di quello che io ritengo un comportamento non lineare o perlomeno migliorabile. E' graditissimo qualsiasi contributo o riflessione: a me ormai si sta annodando il cervello :-)
  • configurazione alternativa: ho parallelamente messo a punto, sempre con lo stesso binding, una configurazione che sembra funzionare (è attiva nel lab da circa 12h ed ho dato una prima analisi hai log) molto bene nel senso che manda correttamente i comandi a souliss e riceve gli aggiornamenti ad evento. Solo che la configurazione non è lineare ovveronon è semplicissima e non si risolve tutta in una definizione degli item ma richiede l'uso di item e rules.
Più tardi pubblico esempio di utilizzo della configurazione trovata.



Di Maio, Dario

unread,
Apr 20, 2014, 6:51:14 AM4/20/14
to sou...@googlegroups.com
Ho letto i tuoi post e credo che sia un bug dovuto al fatto che non vengano separati i dati in ingresso da quelli in uscita, non credo sia voluto.

Dario.


Fulvio Spelta

unread,
Apr 20, 2014, 11:52:41 AM4/20/14
to sou...@googlegroups.com

Ho letto i tuoi post e credo che sia un bug dovuto al fatto che non vengano separati i dati in ingresso da quelli in uscita, non credo sia voluto.

Può essere, il fatto è che nella configurazione globale del binding vi sono alcuni switch riguardanti la "condivisione" dei canali all'interno dello stesso item e fra item diversi. Io ho impostato tutti gli switch in modo da non avere alcuna condivisione però mi pare che non cambi nulla. Questi inoltre, a mio avviso, non spiegano il fatto che non riceve se metti un ip/porta specifico ne il fatto che non crea il canale di input nel caso dei 2 item. SOno un po' deluso però dalla mancanza di risposte dallo sviluppatore e da kai, in fondo basterebbe anche 1/2 riga con scritto "non hai capito niente"...

Ho utilzzato google fino a sbiadirlo ma non ci sono ne doc ne grandi discussioni sul forum (fra l'altro sul forum si capisce pure poco a che versione fa riferimento la discussione....

L'unica è andare a leggersi il codice ed ovvimente ci ho provato solo che mi mancano proprio le basi, mi servirebbe un piccolo supporto da qualcuno che si destreggia con java e famiglia.

A dopo con la configurazione.

Di Maio, Dario

unread,
Apr 20, 2014, 11:56:08 AM4/20/14
to sou...@googlegroups.com

Nel topic di openHAB ha risposto una persona, ho dato qualche dettaglio ma é meglio che specifichi tu.

Dario

From Mobile.

--

Fulvio Spelta

unread,
Apr 21, 2014, 6:35:28 AM4/21/14
to sou...@googlegroups.com
Azzz Karel è il sig. OpenHab in persona :-). Vedo di rispondergli per bene... che emozione.....

Di Maio, Dario

unread,
Apr 21, 2014, 8:50:56 AM4/21/14
to sou...@googlegroups.com

Io ho provato a spiegare il problema per sommi capi, spero di non aver detto scemità.

Niente scampagnata di Pasquetta?

Dario.

From Mobile.

IMG_20140421_125755575.jpg

Fulvio Spelta

unread,
Apr 22, 2014, 4:32:21 AM4/22/14
to sou...@googlegroups.com
Ciao hai scritto benissimo. come vedi dal mio silenzio sono di turno di baby sitting date le vacanze delle scuole :-)

Nei ritagli ho scoperto un comportamento delle rules di OH che richiede la revisione della regola che utilizzo per ricevere i dati dagli eventi. Appena correggo posto il tutto.

Bell'allegato dove ti trovavi ? (non riconosco il soggetto)

ciao
It is loading more messages.
0 new messages