Powiadomienia
Wyczyść wszystko

Harmonogram - konwersja czasu na liczbę

2 Wpisów
1 Użytkownicy
1 Likes
1,761 Wyświetleń
(@maras)
Wpisów: 190
Weteran Donator 2K22 Donator 2K19
Autor tematu
 

Wymyśliłem sobie harmonogram do ogrzewania
Mam item

Setpoint item=Testclock label="Clock [MAP(time.map):%s]" minValue=0 maxValue=1425 step=15 

w mapie mam:

0 00:00
15 00:15
30 00:30
45 00:45
60 01:00
75 01:15
90 01:30
105 01:45
120 02:00

 

I teraz jak stworzyć regułę?

Nie mogę bezpośrednio porównać CurrentTime bo nie jest liczbą. A chcę zrobić coś w stylu jeśli CurrentTIme = Testclock to zmniejsz temp o X stopni.

 

 
Dodane : 15/10/2020 6:09 pm
(@maras)
Wpisów: 190
Weteran Donator 2K22 Donator 2K19
Autor tematu
 

Temat rozwiązany. Opanowałem samemu więc wrzucam rozwiązanie. Może dla kogoś początkującego będzie przydatne.
Sposoby na harmonogramy są różne. Dużo ludzi poleca połączenie z kalendarzem google. Ja sobie wymyśliłem ustawianie w aplikacji tak jak na załączonym screenie.

[IMG] [/IMG]

 

Teraz tak tu moje items:

Switch Harmonogram 
Number Godzinadzien 
Number Tempdzien 
Number Godzinanoc 
Number Tempnoc 
Switch Trybwieczorowy "Tryb wieczorowy"   

Tak to wygląda w sitemap:

Frame label="Harmonogram"
                        {
                        Switch item=Harmonogram
                        Setpoint item=Godzinadzien label="Godzina dzień [JS(numberToClock.js):%s]" minValue=0 maxValue=1425 step=15
                        Setpoint item=Tempdzien label="Temp. w dzień[%.1f °C]" minValue=15 maxValue=30 step=0.5
                        Setpoint item=Godzinanoc label="Godzina noc [JS(numberToClock.js):%s]" minValue=0 maxValue=1425 step=15
                        Setpoint item=Tempnoc label="Temp. w nocy[%.1f °C]" minValue=15 maxValue=30 step=0.5
                        Switch item=Trybwieczorowy        
                        }

Zeby setpoint fajnie nam się wyświetlał jako godzina np. 6:15 musimy zastosować transform (można użyć MAP) ja użyłem JS z przykładu z innego forum.

Plik JS:

(function(i) {
    var hours = Math.floor(i / 60);
    var minutes = i % 60;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    return hours + ":" + minutes;
})(input)

 

No i teraz największy problem jak pobrać godzinę i porównać to z moim Itemem?? Jedno to DataTime drugie to cyfra lub string.
Trochę się naszukałem różnych sposobów konwersji.
Na początku dodawałem godzinę+minutę ale jest jeden kłopot funkcja now.getMinuteofHour zwraca cyfrę, która w przypadku minut 1-9 nie wyświetla się w postaci 01, 02. Przez co mamy np. godzinę 10:6.

Ostatecznie skorzystałem NTP Binding i ustawiłem sobie:

DateTime Current_Time "Aktualny Czas [%1$tH:%1$tM]" {channel="ntp:ntp:local:dateTime"}

Tak to wygląda ostatecznie:

rule "Harmonogram ogrzewanie"
when  Item Current_Time changed  
then
//val String godzina = now.getHourOfDay.toString
//val String minuta = now.getMinuteOfHour.toString
val String aktualnyczas = Current_Time.state.format("%1$tH:%1$tM")
val dzientime = transform("JS""numberToClock.js"Godzinadzien.state.toString )
val noctime = transform("JS""numberToClock.js"Godzinanoc.state.toString )
if (Harmonogram.state == ON)
{
    if(aktualnyczas == dzientime)
    {
    logInfo("TEST","Brawo!"aktualnyczas + dzientime +"temperatura ustawiona na:"Tempdzien.state)
    }
    else if (aktualnyczas == noctime)
    {
    logInfo("TEST","Brawo!"aktualnyczas + noctime +"temperatura ustawiona na:"Tempnoc.state)   
    }
}
end
rule "Tryb wieczorowy"
when  Item Night_State changed to ON 
then
val tempplus = Bitronvideotempsetpoint.state as DecimalType + 1
if (Trybwieczorowy.state == ON)
{
 logInfo("TEST1","Temperatura zmieniona na:"tempplus)   
}
end

 

Zastanawia mnie tylko wyzwolenie reguły czy sprawdzać co minutę (czyli gdy zmienia się czas) czy może lepiej co 15min

czyli when Time cron "0 */15 * ? * *" // Every 15 minutes

 

Screenshot 2020 10 17 14 32 21 187 org.openhab.habdroid
 
Dodane : 17/10/2020 2:34 pm
isom reacted
Udostępnij: