Contenuti

Domotica e meteo: come personalizzare la tua casa in base alle previsioni del meteo

Fare colazione fra i colori del meteo

Una buona abitudine per iniziare la giornata con il piede giusto è quella di alzarsi dal letto ed avere una luce soffusa in giro per casa. Con una lampada RGB o con una striscia led colorata è possibile scegliere il colore con cui illuminare la stanza con le previsioni del tempo, per unire l’effetto di una bella luce colorata soffusa e dinamica con quello che sarà il mood della giornata.

Prerequisiti e ingredienti

  • Una lampada colorata o una striscia rgb comandabile da un server domotico (nel mio caso utilizzo delle striscie rgb connesse ad un ottimo Shelly RGBW2)
  • un server domotico dove inserire la logica di conversione dei colori, nel mio caso impiego Openhab (dai un occhiata al mio post su Openhab)
  • il plugin sul server domotico per consentire l’esecuzione degli script Javascript (JSScripting)
  • una registrazione gratuita sul provider meteo per la relativa ApiKey.
  • un plugin o un provider per i dati meteo, nel mio caso uso il plugin gratuito di Openhab chiamato OpenWeatherMap Binding. Il plugin deve essere configurato con l’ApiKey del provider e dovranno essere creati gli elementi “Item” connessi alle variabili “Cloudiness”, “Rain”, “Snow”.
Configurazione degli item relativi al meteo

Configurazione degli item relativi al meteo

Abbiniamo i colori

Per iniziare abbiniamo i colori alle previsioni del tempo, così per avere subito un’idea chiara e intuitiva delle condizioni meterologiche con un solo sguardo al colore. Questa è solo una delle possibili combinazioni che si possono realizzare, se hai qualche suggerimento scrivilo nei commenti!

  • Per la pioggia, ovviamente l’idea è quella di andare da un azzurro, ad un blu pieno per la piogga pesante, fino ad un viola in caso di temporale con delle saette in tema.
  • Nel caso di una giornata limpida partiamo sicuramente con un bel giallo.
  • Man mano che la nuvolosità aumenta questo colore potrebbe virare verso un grigio.

Le coordinate HSV

Trascrivere questa logica lavorando con le coordinate RGB potrebbe essere complicato, in quanto per abbinare la percentuale di nuvolosità o la quantità di pioggia alle scale di colore desiderate dovremmo trovare delle funzioni matematiche non intuitive. Come ci insegna l’ingegneria, quando il problema si fa duro è necessario un cambio di coordinate! Per identificare i colori non esiste solo la codifica RGB, in cui ogni dimensione è uno dei tre colori primari rosso, verde e blu. Un’altra codifica che torna molto utile in questo caso è HSV o HSB, il cui spazio di valori possiamo rappresentare come un cilindro, avente sulla circonferenza superiore le varie tinte (identificati con i gradi a 0 a 360) che sfumano verso il centro della base superiore diminuendo la saturazione (in percentuale). Alla base inferiore c’è il nero, e longitudinalmente possiamo misurare la brillantezza (in percentuale).

Coordinate HSV

Coordinate HSV

I colori risultanti

meteo % neve % pioggia % nuvole colore scelto
soleggiato 0 0 0
hsv(40,100,100)
nuvoloso 0 0 5
hsv(95,95,100)
molto nuvoloso 0 0 95
hsv(95,45,100)
pioggia leggera 0 10 -
hsv(180,100,100)
pioggia pesante 0 70 -
hsv(240,100,100)
temporale 0 100 -
hsv(280,100,100)
neve 30 - -
hsv(10,100,100)

Lo script

Questa logica la dobbiamo portare sul nostro server di domotica. Nel mio caso ho scelto uno script Javascript (ECMA 262 Edition 11). Gli item a cui faccio riferimento nel codice e che devono essere già presenti sono:

  • quelli relativi al meteo, nel mio caso ho scelto le previsioni a 6 ore: LocalWeatherandForecast_ForecastedWeatherCondition6H, LocalWeatherandForecast_ForecastedCloudiness, LocalWeatherandForecast_ForecastedRain, LocalWeatherandForecast_ForecastedSnow
  • L’item relativo al colore della nostra lampada LuceRgbSoggiorno_Color

Ecco lo script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

// compatibility with older Openhab script
var runtime = require("@runtime");
var itemRegistry =runtime.itemRegistry, events=runtime.events, HSBType=runtime.HSBType, rules=runtime.rules;

// some functions
var randomColor =function(){
  return (Math.random()*360).toString() +","+((Math.random()*50)+50).toString() +"," + ((Math.random()*50)+50).toString()
}
var hsvColor =function(h,s,v){
  return h.toString() +","+s.toString() +"," + v.toString()
}
var hsvColorRandomIntensity =function(h){
  var intensity=Math.random()*50+50; return h.toString() +","+"100" +"," + intensity.toString()
}

// prende in input:
// minGradoColore numero da 0 a 360 che indica nella scala HSV il minimo valore da considerare per un intervallo di colori (quindi il colore scelto nel caso il valore sia minimo)
// maxGradoColore numero da 0 a 360 che indica nella scala HSV il minimo valore da considerare per un intervallo di colori (quindi il colore scelto nel caso il valore sia uguale o superiore al maxValore)
// maxValore numero da 0 a INF che indica il massimo che può raggiungere valore
// valore numero da 0 a INF che indica il valore attuale e che viene considerato fino a maxValore
// ritorna un valore da 0 a 360 (da minGradoColore a maxGradoColore) che indica il valore rapportato al maxValore nell'intervallo fra maxGradoColore e minGradoColore
var calcolaTinta = function(minGradoColore, maxGradoColore, maxValore, valore){
  valore =  valore<=maxValore ? valore : maxValore;
  valore = valore >= 0 ? valore : 0;
  return (valore*1.0/maxValore)*(maxGradoColore-minGradoColore)+minGradoColore;
};

// recupero dei valori del meteo
var previsioni = items.getItem("LocalWeatherandForecast_ForecastedWeatherCondition6H").getState()+"";
var cloudiness = items.getItem('LocalWeatherandForecast_ForecastedCloudiness').rawState.floatValue();// 0 to 1 
var rain = items.getItem('LocalWeatherandForecast_ForecastedRain').rawState.floatValue()*100.0; // 0 to inf
var snow = items.getItem('LocalWeatherandForecast_ForecastedSnow').rawState.floatValue() ; // 0 to inf

// stampa nei log dei dati attuali
console.info("triggered rule " + 'org.openhab.rule.' + ctx.ruleUID)
console.info(JSON.stringify({cloudiness:cloudiness, rain:rain, snow:snow, previsioni:previsioni}));

// scelgo il colore in base al meteo
var color = hsvColor(0,0,100 ); // di default è bianco
if (snow > 0){
  var minSnow = 0;
  var maxSnow = 20;
  var limiteSnow = 2.0;
  
  color = hsvColorRandomIntensity(calcolaTinta(minSnow, maxSnow, limiteSnow, snow),100);
  console.info("dal meteo imposto il colore per NEVE: " + color);
} else if (rain > 0.04){
  var minRain = 160;
  var maxRain = 280;
  var limiteRain = 1.2;
  
  color = hsvColorRandomIntensity(calcolaTinta(minRain, maxRain, limiteRain, rain),100);
  console.info("dal meteo imposto il colore per PIOGGIA: " + color);
} else if (cloudiness > 0.04){
  var minCloud = 95;
  var maxCloud = 95;
  var limiteCloud = 1.0;
  
  var saturation = 100-cloudiness*50.0;
  color = hsvColorRandomIntensity(calcolaTinta(minCloud, maxCloud, limiteCloud, cloudiness),saturation);
  console.info("dal meteo imposto il colore per NUVOLOSO: " + color);
} else {
  var minSun = 35;
  var maxSun = 45;
  var limiteSun = 0.04;
  
  color = hsvColorRandomIntensity(calcolaTinta(minSun, maxSun, limiteSun, cloudiness),100);
  console.info("dal meteo imposto il colore per SOLE: " + color);
}

// impostiamo il colore e accendiamo la luce!
events.sendCommand("LuceRgbSoggiorno_Color", color); 
events.sendCommand("LuceRgbSoggiorno_Color", "ON"); 

Aggiornamenti di luglio 2023
A quanto pare, da luglio 2023 circa, l’estensione OpenWeatherMap o Openhab ha cambiato la gestione del campo pioggia prevista e percentuale di nuvole. Il codice che vedete qui è compatibile con le nuove release. Prima dell’aggiornamento il valore “cloudiness” doveva essere diviso 100.0, mentre non era necessario moltiplicare per 100.0 il valore di pioggia.

Utilizzo

Una volta testato lo script non resta che invocarlo o abbinarlo agli scenari di casa.

  • è possibile invocare lo script a seguito della pressione di un tasto fisico di scenario, così la mattina cliccando sullo scenario “giorno” si potrebbe invocare la logica illuminando delicatamente la casa (ne ho già parlato qui)
  • si può utilizzare il timing di Openhab, per attivarlo in orari predeterminati del giorno, come l’alba
  • si può azionare a seguito di un altro evento, come l’accensione di una lampada o di un apparecchio
  • si può attivare lo scenario dagli assistenti vocali Google Home o Amazon Alexa, creando un item in Openhab pubblicato sulle piattaforme cloud (se ti interessa l’argomento potrei scrivere un articolo, fammelo sapere nei commenti)