Ankündigung

Einklappen
Keine Ankündigung bisher.

Aus einem Data-Item Abschnitte in einer Varible speichern

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Aus einem Data-Item Abschnitte in einer Varible speichern

    Hi zusammen

    Also ich habe ein Item, warscheinlich ein String

    Code:
    DateTime CurrentDate  "Heutiges Datum [%1$tA, %1$td.%1$tm.%1$tY]" <calendar> { channel="ntp:ntp:local:dateTime" }
    Heraus kommt dann im HabPanel

    2018-02-08T08:59:35.958+0100

    Nun brauche ich aber Stunde und Uhrzeit in einer Variable
    Wie kann ich wenn ich sage

    Code:
    Variable = Item.state
    einmal Nur zeichen 12 und 13 einfügt und in einer anderen Variable nur Zeichen 15 und 16 ?

    MfG

    #2
    Es handelt sich um ein DateTime Item, da ist also eine Zahl drin gespeichert (Millisekunden seit 1.1.1970 0:00 Uhr?). In Deiner Variablen möchtest Du Stunde und Minute in einer Variablen. Die Frage ist in dem Zusammenhang aber zuerst: in welchem Format möchtest Du diese Information haben? Als String? Das wäre dann (innerhalb einer Rule) soetwas:
    Code:
    var String Variable = CurrentDate.state.format("%1$H:%1$m")
    Wobei ich das jetzt nicht getestet habe. Wenn Du dagegen damit rechnen willst, nutzt Dir das nichts

    Kommentar


      #3
      Die Stunden müsstest Du so bekommen

      Code:
      var Stunde = CurrentDate.getHourOfDay()
      Die Minuten alleine bekommst Du mit
      Code:
      var Minute = CurrentDate.getMinuteOfHour()
      Evtl. muss noch ein .intValue hintendran...
      Zuletzt geändert von imhofa; 09.02.2018, 12:19. Grund: Ergänung Minuten

      Kommentar


        #4
        Ich möchte damit einfach eine Zeitschaltuhr bauen.
        Momentan setze ich jede Stunde die Minuten zurück und die Stunden auf die Jeweilige Uhrzeit.

        Ein Weiterer Impuls jede Minute setzt die Minuten 1 nach oben.

        So habe ich eine genaue Uhrzeit (auf die Minute genau)

        Nur Spammt mir diese Rules das Event natürlich voll .....

        Also möchte ich die Eingestellte Zeit in eine Variable Speichern und die Uhrzeit an sich auch in eine Variable Speichern.

        So kann ich mit Variablen spielen und habe nur das Wichtige im Event drin.

        Das sollte mit deiner Lösung glaube nicht gehen

        MfG

        EDIT: Thx imhofa das schaut gut aus werde ich gleich testetn
        Zuletzt geändert von Sefina; 09.02.2018, 12:25.

        Kommentar


          #5
          Also hat nicht wirklich geklappt.

          Code:
          var MinutenVariableTest = CurrentDate.getMinuteOfHour()
          var StundenVariableTest = CurrentDate.getHourOfDay()
          
          
          rule "Test"
          when
              Time cron "0 0/1 * * * ?"
          then
                  sendCommand(TestMinuten, MinutenVariableTest)
                  sendCommand(TestStunden, StundenVariableTest)
          end
          Auch wenn ich beim Start die Variable 0 Setze und dann in der Rule sie aktualiesieren möchte geht das auch nicht.

          Noch Jemmand ne Idee ?

          Kommentar


            #6
            So geht das auch nicht. Die Variable wird außerhalb der Rule nur initialisiert (mit welchem Wert auch immer), aktualisiert wird die Variable aber nur, wenn Du das aktiv machst.

            Für eine Zeitschaltuhr kommt es natürlich sehr darauf an, was Du erreichen möchtest. Für das Beispiel, die aktuelle Zeit in Stunden und Minuten zu bekommen, ginge das so:
            Code:
            rule "Zeit setzen"
            when
                Time cron "0 * * * * ?"
            then
                TestMinuten.postUpdate(now.getMinuteOfHour)
                TestStunden.postUpdate(now.getHourOfDay)
            end
            Im OH1-Wiki gibt es immer noch das Beispiel eines Weckers https://github.com/openhab/openhab1-...iki/AlarmClock Allerdings muss man dazu gleich eine Frage stellen, nämlich: warum?

            Zeitschaltuhren sind in den weitaus meisten Fällen sehr fix eingestellt - vielleicht passt man in der Anfangszeit noch etwas an, aber dann soll die Schaltzeit immer gleich wiederholt werden. Das ist nichts, was man ständig auf der Oberfläche braucht (und das ist auch der Grund, warum es bisher keine passenden Widgets gibt, obwohl der Wunsch schon verstanden wurde).
            Im Normalfall wird man also die Schaltzeiten in einer Rule als Time cron Ausdruck festlegen. Damit wird nur zum entsprechenden Zeitpunkt genau einmal eine Aktion ausgeführt. Zugegeben, jemand, der sich nicht auskennt, kann die Zeit nicht selbst einstellen, aber will man denn überhaupt, dass jemand ohne Ahnung am Haus rum schraubt?
            Für den Fall, dass andere die Schaltzeiten verändern sollen, bietet es sich an, ein Kalendersteuerung zu nutzen (das gcal Binding, wenn es online mit dem Google Calendar sein darf, ansonsten das caldav Binding im Zusammenspiel z.B. mit owncloud), dann legt man die Termine über ein Kalenderfrontend fest (z.B. mit dem Handy), die Kalender können dann auch individuell mit Berechtigungen versehen werden.

            Als Alternative kann man zu einer festgelegten Zeit einen Timer starten, dessen Timeout man dann abhängig vom eingestellten Zeitpunkt setzt - einmal täglich initialisieren (und natürlich, falls sich eins der Items ändert), ansonsten wird die Ausführung des Codes dann zum gewünschten Zeitpunkt erledigt.
            Zuletzt geändert von udo1toni; 09.02.2018, 13:57.

            Kommentar


              #7
              Also CalDav ging und geht nicht ...
              Mehr als Fehlermeldungen bekomme ich dort nicht raus ...

              Feste Zeiten mache ich schon über Timer und http- Owncloud Kalender was gut geht.

              Nur muss man bei uns noch Warmes Wasser anschubsen da das Energetisch sinnvoller ist.

              Da die Aufstehzeiten der Frau sich aber jeden Tag ändert und vonn 4,00 bis 8,00 verteilt muss es Flexibel
              und einfach sein.

              Also bekommt meine Frau ihren Timer der funktioniert und dann ist gut

              Kommentar


                #8
                Dein Problem wird sein, dass Du immer mit einer Rule Deine Variablen hochzählen musst. Spätestens beim Thema Neustart/Reboot wird der Vorteil der Variablen (keine Nachricht auf dem Eventbus) durch den Nachteil der fehlenden Persistence-Möglichkeit aufgefressen. Nach dem Neustart fängst Du dann wieder von vorne an, mit Deiner Variable....

                Ich muss udo1toni recht geben in Bezug auf die Zeitschaltuhr: einmal eingerichtet, wird seltenst daran umgestellt. Das galt für meine alten Zeitschaltuhren für die Steckdose genauso, wie für die aktuellen Zeitschaltungen mit openHab. Die Änderungen kommen wenn dann mit einer neuen Anwendung (sprich veränderter Einsatzbedingung) und das erfordert ja aber auch zumindest ein Umstecken der Steckdose bzw. in OpenHAB eine neue Verknüpfung mit den dann auszuführenden Kommandos.

                Eine rudimentäre Zeitschaltuhr habe ich mit der RGB-Effektbeleuchtung im Winter realisiert. Die Rule zum Ein- und Ausschalten der RGB-Leisten ist mit einem CRON-Trigger auf 5 Minuten nach jeder vollen Stunde eingestellt ("0 5 * * * ?") und in der Rule prüfe ich dann nur auf die volle Stunde: eingeschaltet wird morgens ab 7 Uhr (genauer 7:05) und ausgeschaltet wird um 9:05. Am Nachmittag wird um 17:05 eingeschalten und die Leuchten, die die Kinder beim Schlafen stören könnten werden um 20:05 ausgeschaltet, die restlichen um 21:05.
                Die Verschiebung auf 5 Minuten nach der vollen Stunde ist zum Entzerren der Systemlast ausgewählt worden. Die Aktionen, die zur vollen Stunde, z.B. auch um Mitternacht ausgeführt werden sollen/müssen werden nicht zusätzlich mit der belanglosen Schaltung der Effektbeleuchtung "ausgebremst". Und für die Beleuchtung habe ich für mich festgelegt, dass diese Einstellmöglichkeit nur zur Stunde völlig in Ordnung ist.
                Der Vorteil: trotz unterschiedlicher Zeiten gibt es nur eine Rule, die das Ein- und Ausschalten übernimmt.

                Grundsätzlich zeichnet sich das SmartHome ja nicht durch Zeitschaltungen aus, sondern dass unterschiedliche Zustände zu einer bestimmten Aktion führen. D.h. eigentlich ist die Zeitschaltuhr eher ein Hilfskrücke, denn der Normalfall....

                Vielleicht willst Du uns sagen, was Du denn mit dieser Zeitschaltuhr schalten willst. Vielleicht gibt es ja noch andere Ideen zur Lösung Deines Problems - ohne Zeitschaltuhr.

                Grüße,
                Andreas


                PS: zu spät

                Kommentar


                  #9
                  Hallo Sefina,

                  von welcher Granularität reden wir denn bei 4:00 bis 8:00 Uhr? Vielleicht könnte ja auch ein 5-fach Schalter die Lösung sein (z.B. 4:00 5:00 6:00 7:00 8:00)? Dann könnte so eine Lösung, wie ich Sie für die RGB-Leuchten beschrieben habe, wieder einfach möglich sein.

                  Weil ich nehme nicht an, dass die Zeitschaltung tatsächlich minutengenau sein muss...

                  Grüße,
                  Andreas

                  Kommentar


                    #10
                    Für solche verteilten Zeiten bietet sich eine andere Variante an, denn es wird ja nicht darum gehen, zu jedem beliebigen Zeitpunkt zu triggern, sondern zu einer (meinetwegen auch größeren) Anzahl fixer Zeiten. Du legst dann ein Number Item an, welches mit einem Mapping in der Sitemap als Setpoint Widget definiert ist. In der Map gibt es die Zeitpunkte als Klartext.
                    Dazu legst Du eine Rule an, die zu allen festgelegten Zeiten triggert.
                    In der Rule prüfst Du, welchen Status das Setpoint Item hat und entscheidest dann, ob die Auswahl der aktuellen Zeit entspricht. Nachteil ist, dass die verschiedenen Zeiten an verschiedenen Stellen im System angelegt sind und alles zueinander passen muss.
                    .items:
                    Code:
                    Number WWTimer "Warmwasser Extra [MAP(wwtimer.map):%s]"
                    wwtimer.map:
                    Code:
                    0=Aus
                    1=um 04:00 Uhr
                    2=um 04:30 Uhr
                    3=um 05:00 Uhr
                    4=um 05:45 Uhr
                    5=um 06:38 Uhr
                    6=um 07:50 Uhr
                    7=um 08:00 Uhr
                    .sitemap:
                    Code:
                    Setpoint item=WWTimer
                    .rules:
                    Code:
                    rule "WarmWasser Timer"
                    when
                        Time cron "0 0 4 * * ?" or
                        Time cron "0 30 4 * * ?" or
                        Time cron "0 0 5 * * ?" or
                        Time cron "0 45 5 * * ?" or
                        Time cron "0 38 6 * * ?" or
                        Time cron "0 50 7 * * ?" or
                        Time cron "0 0 8 * * ?"
                    then
                        var int iStartTime
                        switch WWTimer.state as Number {
                            case 1: iStartTime = 4 * 60
                            case 2: iStartTime = 4 * 60 + 30
                            case 3: iStartTime = 5 * 60
                            case 4: iStartTime = 5 * 60 + 45
                            case 5: iStartTime = 6 * 60 + 38
                            case 6: iStartTime = 7 * 60 + 50
                            case 7: iStartTime = 8 * 60
                            case default: iStartTime = 24 * 60
                        }
                        if (now.getMinuteOfDay == iStartTime)
                            WWstart.sendCommand(ON)
                    end
                    Wenn Du das Item noch persistierst, sollte das sogar nach einem Neustart laufen.
                    Die Beschriftung könnte man noch ein paar Minuten später setzen, bzw. die eigentlichen Schaltzeitpunkte etwas früher, weil die Warmwasserbereitung ja ein bisschen Vorlauf benötigt.
                    Falls bestimmte Zeiten nur an bestimmten Wochentagen benötigt werden, könnte man das auch noch beim Trigger berücksichtigen. Bleibt das Problem, dass man daran denken muss, den richtigen Eintrag zu aktivieren. Ich als Schichtdienstler denke ja immer noch darüber nach, ob ich nicht meinen Dienstplan dafür anzapfen kann (den pflege ich im Google Kalender...)

                    Nachtrag: Man könnte die Zeitpunkte sogar nach dem Namen des Dienstes benennen. Das wäre die bessere Usability
                    Zuletzt geändert von udo1toni; 09.02.2018, 15:09.

                    Kommentar


                      #11
                      Es geht um das Warmwasser .... Der Boiler wird gestartet und die Zirkupumpe geht an.
                      Das läuft ne Stunde und dann geht es aus.

                      Ein Neustart von Openhab kommt Abends vor und es geht um Morgends.

                      Die Frau will einfach Warmes Wasser zu unterschiedlichsten Zeiten ..... 45min vor dem Aufstehen hat sich bewährt.

                      Ich werde es mit den Variablen testen da sie ja jede Stunde syncronisiert wird.

                      MfG

                      Kommentar


                        #12
                        Also damit geht es und ist viel besser

                        Code:
                        var long MinutenJetztVariable = 0
                        var long StundenJetztVariable = 0
                        rule "Alarm und Uhr"
                        when
                        Time cron "0 0/1 * * * ?"
                        then
                        MinutenJetztVariable = now.getMinuteOfHour
                            StundenJetztVariable = now.getHourOfDay
                            //Warm Wasser Timer über Zeitschaltuhr
                            if (StundenJetztVariable == (AlarmWarmWasserStunden.state as Number)) {
                                if (MinutenJetztVariable == (AlarmWarmWasserMinuten.state as Number)) {
                                    if (AlarmWarmWasserAnktiv.state == ON) {
                                    sendCommand(OpenhabWarmwasser, ON)
                                    logInfo("Zeitschaltuhren.rules", "Warmes Wasser wurde durch die Zeitschaltuhr gestartet")
                                    }
                                }
                        }
                        end
                        Es rennt reibungslos und ist erweiterbar.


                        Thx an alle.

                        MfG

                        Kommentar

                        Lädt...
                        X