Seite 1 von 1

Text in Nummer umwandeln

Verfasst: 18. Dez 2019 19:26
von m.i.c.h.a
Hallo,

ich möchte die Minute des Sonnenuntergangs als Nummer in ein Item speichern. Dazu möchte ich einen Offset addieren und testen, ob die Minuten größer als 60 sind.
Leider funktioniert das mit diesem Code nicht.

Code: Alles auswählen

mSunset.postUpdate (Sunset_Time.state.format("%1$tM") as Number)


if((mSunset.state + mDifferenz.state) > 60 ) {

}

Kann mir jemand helfen?

Re: Text in Nummer umwandeln

Verfasst: 18. Dez 2019 23:51
von peter-pan
Hast du noch ein bisschen mehr Input ? :?:
Z.B. die Items und die gesamte Regel! Ich gehe mal davon aus, dass du das Astro-Binding benutzt.

So wird es sicher nicht funktionieren!!
m.i.c.h.a hat geschrieben: 18. Dez 2019 19:26 mSunset.postUpdate (Sunset_Time.state.format("%1$tM") as Number)
if((mSunset.state + mDifferenz.state) > 60 ) {
}
Aber vielleicht brauchst du das so garnicht, das Astro-Binding liefert dir das "frei Haus"
sunset.jpg

Code: Alles auswählen

Number:Time  SonnenDatenSetDuration  "SetDuration  Dauer"   (gAstrotest) {channel="astro:sun:local:set#duration"}

Re: Text in Nummer umwandeln

Verfasst: 19. Dez 2019 00:03
von 03chris
Du kannst es so umwandeln:

Code: Alles auswählen

val sunset = Integer::parseInt(Sunset_Time.state.format("%1$tM"))

Re: Text in Nummer umwandeln

Verfasst: 19. Dez 2019 10:47
von m.i.c.h.a
Vielen Dank für die Antworten.
Mein Ziel ist es, eine Regel zu erstellen, die bei Sonnenuntergang eine Steckdose einschaltet. Die Zeit bekomme ich vom Astro-Binding. Dabei möchte ich einen variablen Offset über ein Item eingeben können. Das schalten ohne Offset funktioniert schon.

Item

Code: Alles auswählen

Number Stunde   
Number Minute 
Number hSunset  "Stunde Ein[%s]"
Number mSunset "Minute Ein[%s]"
Number mDifferenz   "Diff[%s]"	//Offset in Minuten von Habpanel
Rule

Code: Alles auswählen

rule "Zeit"
when
    Time cron "*/30 * * * * ?"	//alle 30sek
then
    //aktuelle Zeit
    Minute.postUpdate(now.getMinuteOfHour)
    Stunde.postUpdate(now.getHourOfDay)

    mSunset.postUpdate (Sunset_Time.state.format("%1$tM"))	//Minuten Sonnenuntergang
    hSunset.postUpdate (Sunset_Time.state.format("%1$tH"))	//Stunden Sonnenuntergang
       
    if( mDifferenz.state > 0 ) {
                if((mSunset.state + mDifferenz.state) > 60 ) {		//wenn Minuten mit Offset größer als 60
                    mSunset.postUpdate (mSunset + mDifferenz - 60)	//Minuten -60
                    hSunset.postUpdate (hSunset + 1)			//bei Stunden +1
                }
                else{
                    mSunset.postUpdate (mSunset + mDifferenz)
                    hSunset.postUpdate (hSunset)
                }
     }
     
     if (Stunde.state == (hSunset.state as DecimalType).intValue && Minute.state == (mSunset.state as DecimalType).intValue){
            if(S_Sonoff_POW_A.state == ON) {Sonoff_Pow_Switch.sendCommand(ON)}
     }
 end  

Re: Text in Nummer umwandeln

Verfasst: 19. Dez 2019 10:58
von PeterA
Das ist doch m.E. garnicht nötig, da man im Astrobindung bei "RangeEventSunSet" einen Offset Eingeben kann....
sunset.PNG
Gruß Peter

Re: Text in Nummer umwandeln

Verfasst: 19. Dez 2019 11:31
von m.i.c.h.a
Aber nicht übers Habpanel variabel von jedem "Laien" einstellbar. ;)

Re: Text in Nummer umwandeln

Verfasst: 19. Dez 2019 14:17
von udo1toni
Also, mal abgesehen vom Sinn (Warum sollte man den Offset ständig anpassen wollen? Die Idee des Offset zum Sonnenuntergang ist doch gerade, ein gleichbleibendes Ergebnis zu erhalten?) ist es fürchterlich, eine Rule alle 30 Sekunden Items setzen zu lassen, die sich maximal einmal täglich ändern.

Korrekt löst man das Problem mit einem Timer. Dazu benötigst Du eine Rule. In dieser Rule wird die korrekte Schaltzeit in ein Item gespeichert, immer, wenn sich die Astrozeit ändert (das passiert einmal täglich um Mitternacht) oder sich das Offsetitem ändert. Weiterhin errechnet die Rule, ob der gewünschte Schaltzeitpunkt bereits überschritten wurde (dann wird der Timer für den nächsten Tag gesetzt) oder noch nicht, dann wird der Timer für den aktuellen Tag gesetzt.
Ungetestete Rule:

Code: Alles auswählen

// globale Variablen zu Beginn der Datei definieren!
var Timer tSunset = null

rule "Sonnenungergang mit variablem Offset"
when
    Time cron "0 1 0 * * ?" or                                                                                                                      // täglich um 00:01:00 Uhr
    Item mDifferenz changed                                                                                                                         // Offset geändert
then
    if(!(Sunset_Time.state instanceof DateTimeType)) {                                                                                              // keine Zeit gesetzt?
        logWarn("sunsetvar","Astro Binding liefert keine gültige Zeit! Abbruch!")
        return;                                                                                                                                     // Rule beenden
    }
    var Integer nDiff = 0                                                                                                                           // Default Wert
    if(mDifferenz.state instanceof Number)                                                                                                          // wurde ein Wert gesetzt?
        nDiff = (mDifferenz.state as Number).intValue                                                                                               // dann übernehmen
    tSunset?.cancel                                                                                                                                 // alten Timer löschen, falls vorhanden
    val Integer iMinutes = Integer::parseInt(Sunset_Time.state.format("%1$tM")) + Integer::parseInt(Sunset_Time.state.format("%1$tH"))*60 + nDiff   // Startzeit berechnen
    val Integer iMinute = iMinutes % 60                                                                                                             // reale Minute berechnen
    val Integer iHour = (iMinutes / 60).intValue                                                                                                    // reale Stunde berechen
    tRealTime.postUpdate(iHour.toString + ":" + iMinute.toString + " Uhr")                                                                          // in ein String Item speichern (nur Anzeige)
    tSunset = createTimer(now.withTimeAtStartOfDay.plusMinutes(iMinutes).plusDays(if(iMinutes > now.getMinuteOfDay) 0 else 1),[|                    // neuen Timer erzeugen
                                                                                                                                                    // Wenn der Timer abläuft
        if(S_Sonoff_POW_A.state != ON)                                                                                                              // Falls S_Sonoff_POW_A.state nicht ON
            Sonoff_Pow_Switch.sendCommand(ON)                                                                                                       // send Kommando ON
        tSunset = null                                                                                                                              // lösche Timer
    ])
end
Zur Anzeige der realen Schaltzeit wird nur das String Item tRealTime benötigt. Man kann natürlich auch ein DateTime Item verwenden, aber die Umwandlung ist komplizierter und ich bin grad zu faul, das nachzuschauen... ;)

Der Punkt ist, diese Rule wird einmal täglich und bei jeder Änderung des Offsets ausgeführt. Sie erzeugt einen Timer, der zur gewünschten Zeit abläuft. Mehr braucht es nicht.
Zu Beginn der Rule werden noch ein paar Fehlerquellen abgefangen, nur für den Fall. Bei der Prüfung auf DateTimeType bin ich mir nicht 100% sicher, notfalls kann man den Teil auch weg lassen, besser wäre es aber, statt einfach davon auszugehen, dass das Binding schon ein Datum zurückliefern wird...