Text in Nummer umwandeln

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
m.i.c.h.a
Beiträge: 22
Registriert: 4. Apr 2019 10:47
Answers: 0

Text in Nummer umwandeln

Beitrag 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?
micha
-------------------------------------------------------------------------
openHab4.3.3 auf Synology DS918+

Benutzeravatar
peter-pan
Beiträge: 2758
Registriert: 28. Nov 2018 12:03
Answers: 30
Wohnort: Schwäbisch Gmünd

Re: Text in Nummer umwandeln

Beitrag 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"}
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.3.5 openhabian

03chris
Beiträge: 28
Registriert: 4. Feb 2018 17:10
Answers: 1

Re: Text in Nummer umwandeln

Beitrag von 03chris »

Du kannst es so umwandeln:

Code: Alles auswählen

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

m.i.c.h.a
Beiträge: 22
Registriert: 4. Apr 2019 10:47
Answers: 0

Re: Text in Nummer umwandeln

Beitrag 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  
micha
-------------------------------------------------------------------------
openHab4.3.3 auf Synology DS918+

Benutzeravatar
PeterA
Beiträge: 1106
Registriert: 8. Feb 2019 12:12
Answers: 13

Re: Text in Nummer umwandeln

Beitrag von PeterA »

Das ist doch m.E. garnicht nötig, da man im Astrobindung bei "RangeEventSunSet" einen Offset Eingeben kann....
sunset.PNG
Gruß Peter
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- OpenHab 2.4
#PWRUP

m.i.c.h.a
Beiträge: 22
Registriert: 4. Apr 2019 10:47
Answers: 0

Re: Text in Nummer umwandeln

Beitrag von m.i.c.h.a »

Aber nicht übers Habpanel variabel von jedem "Laien" einstellbar. ;)
micha
-------------------------------------------------------------------------
openHab4.3.3 auf Synology DS918+

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Text in Nummer umwandeln

Beitrag 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...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten