๐ ElioKit Java SDK
Documentazione completa della libreria Java per controllare dispositivi ElioKit via MQTT.
โฌ๏ธ Download SDK
Fat JAR con tutte le dipendenze incluse (Paho MQTT + Gson).
Pronto all'uso, nessuna dipendenza aggiuntiva necessaria.
Iniziare
L'ElioKit Java SDK permette di controllare una scheda ElioKit da qualsiasi applicazione Java. La comunicazione avviene tramite MQTT: l'SDK si connette al broker e invia/riceve messaggi JSON.
Requisiti
- Java 11 o superiore
- Maven (per la gestione delle dipendenze)
- Accesso al broker MQTT (host, porta, credenziali)
- MAC address della scheda ElioKit (ottenibile dalla pagina Configura)
Aggiungere al progetto Maven
Opzione 1: JAR locale (fat JAR con tutte le dipendenze)
๐ฆ Scarica il JAR, poi copialo nella cartella libs/ del tuo progetto e aggiungi al pom.xml:
<dependency>
<groupId>com.eliokit</groupId>
<artifactId>eliokit-sdk</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/eliokit-sdk-1.0.0-all.jar</systemPath>
</dependency>
Opzione 2: Installazione locale Maven
Se hai i sorgenti dell'SDK, installalo nel repository Maven locale:
cd eliokit-java-sdk
mvn clean install
Poi nel pom.xml del tuo progetto:
<dependency>
<groupId>com.eliokit</groupId>
<artifactId>eliokit-sdk</artifactId>
<version>1.0.0</version>
</dependency>
Esempio rapido
import com.eliokit.sdk.*;
public class Main {
public static void main(String[] args) throws Exception {
// Crea l'istanza con MAC address, broker, porta, user, password
try (ElioKit board = new ElioKit("3485184647BC", "89.38.128.18", 1883, "mqttuser", "password")) {
board.connect();
Thread.sleep(2000); // attendi connessione
// Accendi tutti i LED di rosso per 3 secondi
board.setLed(0, LedColor.RED, 3);
// Emetti un bip
board.buzzer(1000, 50, 500);
// Leggi temperatura
double temp = board.getTemperature();
System.out.println("Temperatura: " + temp + " ยฐC");
// Pronuncia un testo
board.say("Ciao, sono ElioKit!");
Thread.sleep(5000);
} // disconnect automatico
}
}
Costruttore
macAddress- MAC address della scheda, senza separatori (es.
"3485184647BC"). Lo puoi leggere dalla pagina Configura. brokerHost- IP o hostname del broker MQTT (es.
"89.38.128.18") brokerPort- Porta TCP del broker (tipicamente
1883) username- Username per l'autenticazione MQTT (
nullse non richiesto) password- Password per l'autenticazione MQTT (
nullse non richiesto)
Connessione
/MAC/values, /MAC/ircode, /MAC/photo).Lancia MqttException se la connessione fallisce.
Ritorna true se connesso.
AutoCloseable, quindi puรฒ essere usata con try-with-resources.Listener eventi
L'interfaccia ElioKitListener ha i seguenti metodi (tutti default, implementa solo quelli che servono):
public interface ElioKitListener {
void onConnected(); // connessione MQTT stabilita
void onDisconnected(Throwable cause); // connessione persa
void onValuesReceived(SensorValues values); // valori sensori ricevuti
void onIrCodeReceived(String irCode); // codice IR ricevuto
void onPhotoReceived(byte[] jpegData); // foto JPEG ricevuta
void onMessageReceived(String topic, String payload); // messaggio generico
void onError(String message, Throwable cause); // errore
}
LED โ setLed
id0= tutti i LED,1-17= LED singolocolor- Colore dall'enum
LedColor(vedi tabella colori) duration- Durata in secondi.
0= resta acceso all'infinito
brightness- Luminositร da
0(spento) a100(massimo)
Esempio:
board.setLed(0, LedColor.RED, 5); // tutti i LED rossi per 5 secondi
board.setLed(1, LedColor.BLUE, 0); // LED 1 blu infinito
board.setLed(0, LedColor.GREEN, 3, 50); // tutti verdi, 3 sec, luminositร 50%
LED โ Spegnimento
id0= tutti,1-17= specifico
Buzzer
frequency- Frequenza in Hz (es.
1000= 1kHz) volume- Volume da
0a100 duration- Durata in millisecondi (es.
500= mezzo secondo)
Esempio:
board.buzzer(1000, 50, 500); // bip a 1kHz, volume 50%, durata 500ms
board.buzzer(2000, 80, 1000); // bip a 2kHz, volume 80%, durata 1 secondo
Buzzer โ Spegnimento
Vibrazione
durationMs- Durata della vibrazione in millisecondi
pauseMs- Pausa dopo la vibrazione in millisecondi
repetitions- Numero di ripetizioni (
-1= infinito)
Esempio:
board.vibrate(200); // vibrazione singola 200ms
board.vibrate(100, 200, 5); // 100ms vibra, 200ms pausa, 5 volte
board.vibrate(500, 500, -1); // vibrazione continua 500ms on/off
Audio โ Text-to-Speech
it_IT-paola-medium).text- Testo da pronunciare (es.
"Ciao, sono ElioKit!")
text- Testo da pronunciare
voice- Nome della voce Piper TTS (es.
"it_IT-paola-medium"). Vedi tabella voci per l'elenco completo.
Voice. Piรน comodo e type-safe rispetto alla variante con stringa.text- Testo da pronunciare
voice- Voce dall'enum
Voice(es.Voice.IT_PAOLA_MEDIUM). Vedi tabella voci per l'elenco completo.
it_IT-paola-medium).
Esempio:
board.say("Ciao mondo!"); // voce di default (paola)
board.say("Benvenuto a casa!", Voice.IT_PAOLA_MEDIUM); // voce italiana Paola (enum)
board.say("Hello!", Voice.EN_US_AMY_MEDIUM); // voce inglese Amy (enum)
board.say("Benvenuto!", "it_IT-paola-medium"); // voce italiana Paola (stringa)
Riferimento โ Voci Text-to-Speech
Voci disponibili sul server Piper TTS tramite l'enum Voice. Altre voci possono essere aggiunte scaricandole da Piper Voices.
| Enum | Nome Piper | Lingua | Genere | Qualitร |
|---|---|---|---|---|
Voice.IT_PAOLA_MEDIUM | it_IT-paola-medium | ๐ฎ๐น Italiano | Femminile | Media (default) |
Voice.IT_RICCARDO_FASOL_X_LOW | it_IT-riccardo_fasol-x_low | ๐ฎ๐น Italiano | Maschile | Bassa |
Voice.EN_US_AMY_MEDIUM | en_US-amy-medium | ๐บ๐ธ English (US) | Female | Medium |
Voice.EN_US_RYAN_MEDIUM | en_US-ryan-medium | ๐บ๐ธ English (US) | Male | Medium |
Voice.EN_GB_ALBA_MEDIUM | en_GB-alba-medium | ๐ฌ๐ง English (GB) | Female | Medium |
.onnx e .onnx.json dal repository Piper Voices e copiali nella cartella voices/ del server TTS. Sono disponibili voci in molte lingue: italiano, inglese, francese, tedesco, spagnolo e altre. Puoi usare voci non presenti nell'enum passandole come stringa a say(String text, String voice).
Audio โ Riproduzione file
url- URL del file audio (MP3, WAV, ecc.)
Audio โ Radio
url- URL dello stream radio (es. URL di un flusso Icecast/Shoutcast)
channel- Numero del canale radio
Esempio:
board.radioPlay("http://icecast.radiodeejay.it/dj.mp3");
Thread.sleep(10000);
board.radioStop();
Audio โ Volume
volume- Livello volume da
0(muto) a8(massimo)
Sensori โ Lettura
Ritorna un oggetto SensorValues con tutti i valori, o null se timeout.
timeoutMs- Timeout in millisecondi
onValuesReceived().Ritorna null se non รจ mai stata fatta una lettura.
Esempio:
SensorValues v = board.fetchValues();
if (v != null) {
System.out.println("Temperatura: " + v.getTempC() + " ยฐC");
System.out.println("Umiditร : " + v.getHumidity() + " %");
System.out.println("Pressione: " + v.getPressure() + " mbar");
System.out.println("Prossimitร : " + v.getProximity() + " mm");
System.out.println("Luce: " + v.getLight() + " lux");
}
Sensori โ Metodi singoli (shortcut)
Ogni metodo esegue internamente un fetchValues() e restituisce il valore richiesto. Ritorna Double.NaN o 0 in caso di errore.
true se il device รจ alimentato da USB.port- Numero della porta (
1-5)
Ritorna 0 (LOW) o 1 (HIGH).
SensorValues โ Proprietร
L'oggetto SensorValues restituito da fetchValues() contiene tutti i campi con getter:
SensorValues v = board.fetchValues();
// Ambiente
v.getTempC() // double โ temperatura ยฐC
v.getTempF() // double โ temperatura ยฐF (calcolata)
v.getTempOutC() // double โ temperatura esterna ยฐC
v.getHumidity() // double โ umiditร %
v.getPressure() // double โ pressione mbar
v.getAltitude() // double โ altitudine m
v.getTvoc() // double โ TVOC ppb
v.getLight() // double โ luminositร lux
v.getLightRed() // int โ componente rossa luce
v.getLightGreen() // int โ componente verde luce
v.getLightBlue() // int โ componente blu luce
v.getIrLight() // int โ luce IR
// Prossimitร
v.getProximity() // double โ distanza mm
// Movimento
v.getGyroX/Y/Z() // int โ giroscopio ยฐ/s
v.getAccelX/Y/Z() // int โ accelerometro mG
v.getCubePosition() // int โ faccia cubo (1-6)
// Alimentazione
v.getBatteryVoltage() // double โ tensione batteria V
v.isPlugged() // boolean โ alimentato USB
v.isWirelessCharging()// boolean โ ricarica wireless
// Porte digitali
v.getD1() ... v.getD5() // int โ stato porte (0/1)
// Rete e posizione
v.getIp() // String โ indirizzo IP
v.getMac() // String โ MAC address
v.getLatitude() // double โ latitudine
v.getLongitude() // double โ longitudine
v.getCity() // String โ cittร
v.getRegion() // String โ regione
v.getCountry() // String โ paese
v.getSsid() // String โ nome rete WiFi
v.getVersion() // String โ versione firmware
Camera โ Scatta foto
onPhotoReceived(byte[] jpegData).resolution- Risoluzione:
0=QQVGA,1=QVGA,2=VGA,3=SVGA,4=XGA,5=SXGA (vedi tabella)
resolution- Risoluzione (
0-5) brightness- Luminositร della camera da
-2(piรน scuro) a+2(piรน luminoso).0= default
Camera โ Scatta foto (sincrono)
resolution- Risoluzione (
0-5) timeoutMs- Timeout massimo in millisecondi
Ritorna i byte JPEG dell'immagine, o null se timeout.
resolution- Risoluzione (
0-5) brightness- Luminositร della camera da
-2a+2(0= default) timeoutMs- Timeout massimo in millisecondi
Ritorna i byte JPEG dell'immagine, o null se timeout.
brightness con valore 1 o 2 per schiarirle.
I valori ammessi sono da -2 (molto scuro) a +2 (molto luminoso).
Esempio:
// Foto con luminositร default
byte[] jpeg = board.takePhotoSync(2, 15000);
// Foto con luminositร aumentata (+2) โ utile in ambienti bui
byte[] jpegBright = board.takePhotoSync(2, 2, 15000);
// Foto asincrona con luminositร aumentata
board.takePhoto(2, 2); // VGA, brightness +2
if (jpeg != null) {
java.io.FileOutputStream fos = new java.io.FileOutputStream("foto.jpg");
fos.write(jpeg);
fos.close();
System.out.println("Foto salvata: " + jpeg.length + " bytes");
}
I/O โ Porte digitali
port- Nome della porta:
"D1"-"D5","LED","IO39","IO40","IO41","IO02","IO44" value0= LOW,1= HIGH
Esempio:
board.setPort("D1", 1); // porta D1 HIGH
board.setPort("D1", 0); // porta D1 LOW
I/O โ Infrarosso
address- Indirizzo NEC del dispositivo
command- Comando NEC da inviare
I/O โ Webhook
url- URL dell'endpoint
sendValues- Se
true, allega i valori dei sensori alla richiesta
Servo Motore
angle- Angolo da
0a180gradi
angle- Angolo da
0a180gradi gpio- Numero del pin GPIO a cui รจ collegato il servo (default:
39)
angle- Angolo da
0a180gradi gpio- Numero del pin GPIO (
39= default) duration- Durata in millisecondi prima di spegnere il PWM.
0= mantieni il segnale attivo
angle- Angolo da
0a180gradi
angle- Angolo da
0a180gradi gpio- Pin GPIO
duration- Durata in ms (
0= mantieni attivo)
Esempio Java SDK:
// Muovi servo a 90ยฐ (default GPIO39, PWM resta attivo)
board.servo(90);
// Muovi servo a 45ยฐ su GPIO 40
board.servo(45, 40);
// Muovi servo a 0ยฐ, spegne PWM dopo 2 secondi
board.servo(0, 39, 2000);
// Comando diretto MQTT (piรน veloce, senza programma JSON)
board.servoCommand(180);
board.servoCommand(90, 40, 1000);
Esempio JSON (programma):
// Muovi servo a 90ยฐ sul pin di default
{"do":[{"servo":{"angle":90}}]}
// Muovi servo a 45ยฐ sul GPIO 40, mantieni per 2 secondi
{"do":[{"servo":{"angle":45, "gpio":40, "duration":2000}}]}
// Muovi servo a 0ยฐ e poi a 180ยฐ con timer
{"do":[
{"servo":{"angle":0}},
{"task":{"id":0, "after":2, "do":[{"servo":{"angle":180}}]}}
]}
Configurazione Task
Il dispositivo ElioKit esegue diversi task FreeRTOS per gestire sensori, attuatori e comunicazione. ร possibile abilitare o disabilitare i singoli task per ridurre il carico del processore. La configurazione viene salvata in memoria permanente (NVS) e applicata al successivo avvio.
onTaskConfigReceived(String) del listener.timeoutMs- Timeout in millisecondi
taskConfigJson- JSON con i task da abilitare/disabilitare (
1= abilitato,0= disabilitato)
mqtt, httpFileDownloader, sdCard, camera, accelGyro, humTemp, ir, proximity, barometer, lightRGB, tvoc, buzzer, servo, webhook, io, pins, audio, audioManager, systemEvents, systemMonitor.
mqtt impedirร di comunicare con il device via MQTT. In tal caso, utilizzare la porta seriale USB con il comando RESET_TASKS per ripristinare la configurazione.
Esempio โ Disabilitare task non necessari:
// Disabilita camera, tvoc e servo
board.setTaskConfig("{\"camera\":0,\"tvoc\":0,\"servo\":0}");
// Il device si riavvierร automaticamente
// Leggi la configurazione corrente (sincrono)
String config = board.fetchTaskConfig();
System.out.println("Task config: " + config);
// Output: {"mqtt":1,"httpFileDownloader":1,"sdCard":1,"camera":0,...,"servo":0,...}
// Ripristina tutti i task (tutti abilitati)
board.resetTaskConfig();
// Il device si riavvierร automaticamente
Comandi seriali equivalenti (via USB):
GET_TASKS โ restituisce la configurazione corrente
SET_TASKS {"camera":0,"tvoc":0} โ imposta e riavvia
RESET_TASKS โ ripristina default e riavvia
Listener per la configurazione task:
board.addListener(new ElioKitListener() {
@Override
public void onTaskConfigReceived(String taskConfigJson) {
System.out.println("Config task: " + taskConfigJson);
}
});
board.getTaskConfig(); // asincrono: la risposta arriva nel listener
Sistema โ Riavvio
Sistema โ Programmi JSON
programJson- JSON completo del programma (es.
{"do":[...]})
Esempio:
// Esegui un programma che accende i LED rossi al tap
String program = "{\"do\":[{\"on\":{\"tap\":[{\"led\":{\"color\":12,\"duration\":2,\"id\":0}}]}}]}";
board.runProgram(program);
Sistema โ Pulsanti virtuali
buttonName- Nome del pulsante:
"touchPlus","touchMinus","touchLeft","touchRight","touchCircle","touchSquare","touchTriangle","touchX","touch0"-"touch9"
Riferimento โ Tabella Colori LED
| Enum | Indice | Colore |
|---|---|---|
LedColor.OFF | 0 | Spento |
LedColor.WHITE | 1 | Bianco |
LedColor.ORANGE | 2 | Arancione |
LedColor.YELLOW | 3 | Giallo |
LedColor.LIGHT_GREEN | 4 | Verde chiaro |
LedColor.GREEN | 5 | Verde |
LedColor.TEAL | 6 | Teal |
LedColor.CYAN | 7 | Ciano |
LedColor.LIGHT_BLUE | 8 | Azzurro |
LedColor.BLUE | 9 | Blu |
LedColor.PURPLE | 10 | Viola |
LedColor.MAGENTA | 11 | Magenta |
LedColor.RED | 12 | Rosso |
Riferimento โ Risoluzioni Camera
| Valore | Nome | Risoluzione |
|---|---|---|
0 | QQVGA | 160 ร 120 |
1 | QVGA | 320 ร 240 |
2 | VGA | 640 ร 480 (default) |
3 | SVGA | 800 ร 600 |
4 | XGA | 1024 ร 768 |
5 | SXGA | 1280 ร 1024 |