Nog een tip waar ik laatst achter kwam.
Ik gebruikte timers op meerdere manieren. Mijn meest gebruikte manier was via rules een Timer te maken. Deze voert na een x aantal minuten/seconden de code uit en die kan je eventueel 'rescedulen':
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| var Timer tmrWaitoff = null
if (tmrWaitoff !== null){
tmrWaitoff.cancel()
}
tmrWaitoff = createTimer(now.plusSeconds(60), [|
if (Playstation.state == ON){
Voice.postUpdate("Let op! De Playstation staat nog aan terwijl de TV uit staat!")
} else {
tmrWaitoff.rescedule(now.plusSeconds(60))
}
tmrWaitoff = null
]) |
Nadeel wat ik merk bij dit is dat de cpu load op mijn Pi erg hoog wordt bij dit soort acties. Bovenstaand heb ik gekopeerd uit één van mijn rules files, aangepast met rescedule als voorbeeld (compleet onlogisch, maar kon ff zo snel niks anders bedenken haha).
Vooral bij lampen die tijdelijk aan moeten blijven en bijvoorbeeld langzaam moeten dimmen (now.plusSeconds(1) bijvoorbeeld), krijgt de cpu aardig wat op zijn bord schijnbaar. Nog een nadeel is dat het niet super logisch werkt. Dat stukje code wordt dus niet uitgevoerd als de rule uitgevoerd wordt, maar pas na x seconden. Daarbij moet je ervoor zorgen dan die timer niet 2 keer geladen wordt. Dus 2x een rule laden door een motion sensor waar je 2 keer langs loopt, zorgt ervoor dat de timer 2 keer uitgevoerd gaat worden, 3x langslopen is 3x, etc. dus je moet een .cancel() gebruiken, maar dat mag alleen als de timer niet null is. Daarbij kan je de timer niet uitlezen, je weet niet hoe lang het nog duurt voordat hij 'gefired' wordt. Maar dat kan de expire binding ook (nog) niet. Kortgezegd, je moet wel weten wat je doet bij gebruik van deze timers.
Ik heb afgelopen weken veel omgezet naar switches die gekoppeld zijn aan de expire binding. Dus je hebt een schakelaar die uitschakelt na 1 seconde bijvoorbeeld. Idee is dan om de schakelaar in te schakelen als de lampen langzaam moeten dimmen. Dan een rule maken die de schakelaar steeds weer aan zet, lamp iets dimt totdat de lamp uit is. Zoals dit (één van mijn meest leuke dingetjes die ik gebouwd heb, lampen die langzaam dimmen als je in bed ligt, dat voelt werkelijk heerlijk):
code:
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
| item:
Switch SlaapkamerFade "Slaapkamer fade schakelaar" { expire="1s,command=OFF" }
----
var Number numTimeout
var Number numSpeed
var Number numValueLamp
var Number numValueSpots
-----
rule "Slaapkamer fade"
when
Item SlaapkamerFade changed to OFF
then
if (SlaapkamerTimeout.state == ON || Slaapkamer_motion.state == ON || Slaapkamerforce.state == ON){
return;
}
numValueLamp = Slaapkamerlamp.state
numValueSpots = Slaapkamerspots.state
numValueLamp = numValueLamp - numSpeed
numValueSpots = numValueSpots - numSpeed
if (numValueLamp < 0){
numValueLamp = 0
}
if (numValueSpots < 0){
numValueSpots = 0
}
Slaapkamerlamp.sendCommand(numValueLamp)
Slaapkamerspots.sendCommand(numValueSpots)
Slaapkamerkastspot1.sendCommand(numValueSpots)
Slaapkamerkastspot2.sendCommand(numValueSpots)
if (numValueLamp > 0 || numValueSpots > 0){
SlaapkamerFade.postUpdate(ON)
}
if (numValueLamp == 0 && numValueSpots == 0 && (System_pod_mode.state == "voornacht" || System_pod_mode.state == "nacht")){
SlaapkamerSleep.postUpdate(ON)
}
end |
De variabelen numValueLamp, numSpeed enzo declareer ik helemaal bovin de rules file, zodat ze global worden. Anders zouden ze bij het uitschakelen van die expire schakelaar steeds naar dezelfde waarde terug keren in mijn voorbeeld.
Dit zorgt er bij mij voor dat de rest van de woning nog normaal reageert als zo'n expire binding gebruikt wordt. Bij de createTimer functie zorgde het er bij mij voor dat als er 2 of meerdere van die timers liepen, de motion sensors veel te laat uitgelezen werden en sommige ruimtes even donker bleven als je daar kwam. En dat laat de WAF behoorlijk zakken

.
Ik denk dat de Expire binding efficiënter is omdat hij hiervoor bedoelt is.
Waarom ik nog createTimer gebruik? Om de simpele reden dat ik niet steeds een item wil maken voor een korte simpele timeout. Een item toevoegen zorgt toch voor een soort reload van veel van je rules files wat het systeem in mijn geval erg traag maakt. Ik heb 31 rules files met zo'n 7500 regels aan code in totaal. Daar wordt de raspberry pi soms wat nerveus van