Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Blockly täglichen Verbrauch hochzählen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Blockly täglichen Verbrauch hochzählen

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      Fritzk last edited by

      Hallo bräuchte mal kurz Hilfe bei folgendem Blockly. Zwischenablage01.jpg

      Also ich hab einen Wert "Aktueller Zählerstand". Wenn sich der Wert ändert, soll sich die Variable "täglicher Verbrauch" um die Differenz zum alten Zählerstand ( MemZählerstand) erhöhen und der Wert soll dann in den Datenpunkt "Verbrauch heute" geschrieben werden.
      Krieg aber so nur Fehlermeldungen

      Asgothian 1 Reply Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @Fritzk last edited by

        @fritzk Nimm mal den rot markierten Baustein weg, dann sollte es zumindest realistisch gehen. Wobei sich mir die Frage stellt wo / wann der Datenpunkt "MemZählerstand" erhöht wird. Die Logik erschliesst sich mir nicht.

        Screenshot 2022-12-20 at 13.00.49.png

        F 1 Reply Last reply Reply Quote 0
        • F
          Fritzk @Asgothian last edited by

          @asgothian Das ganze schaut so aus

          Zwischenablage01.jpg

          kommt trotzdem noch eine Fehlermeldung

          Codierknecht N Asgothian paul53 4 Replies Last reply Reply Quote 0
          • Codierknecht
            Codierknecht Developer Most Active @Fritzk last edited by Codierknecht

            @fritzk
            Du läufst in die "Asynchron-Falle".
            Wenn der Trigger feuert, ist der Wert noch nicht wirklich geschrieben.
            Ersetze den markierten Block durch den Wert des feuernden Trigger. Den Block finderst Du in "Trigger" - dort heißt er zunächst noch "Objekt ID".

            93938d37-12fb-4f54-ac20-54f49274b7f1-image.png

            [EDIT]
            Und eine Variable wird nicht mit "Wert von" gelesen. Den Block kannst Du löschen und stattdessen die Variable allein verwenden.

            F 1 Reply Last reply Reply Quote 0
            • N
              Nordischerjung @Fritzk last edited by

              @fritzk nicht erhöhe täglichen Verbrauch, nimm mal setze

              1 Reply Last reply Reply Quote 0
              • Asgothian
                Asgothian Developer @Fritzk last edited by

                @fritzk

                Nun ja,

                ich gehe mal davon aus das dein Zähler den "Verbrauch" Zählt. Ist das soweit korrekt ?

                Dann sollte also der Verbrauch am Ende des Tages = Zählerstand - MemZählerstand sein.

                So wie du es jetzt machen willst hängt es davon ab wie oft der Datenpunkt AktuellerZählerstand erhöht wird.

                Das was @Codierknecht geschrieben hat stimmt so nicht. Der Wert ist schon korrekt geschrieben (In diesem Fall)- die Variante die Du genutzt hast nutzt nur unnötig Ressourcen, weswegen seine besser ist.

                Die Typische Asynchron-Falle ist

                • Steuere(TestDP, 10)
                • Steuere(TestDP2, Wert(TestDP)

                In diesem Fall bekommt TestDP2 nicht immer den Wert 10.

                A.

                F 1 Reply Last reply Reply Quote 0
                • F
                  Fritzk @Codierknecht last edited by

                  @codierknecht Das war mein Fehler.
                  Danke dir. jetzt hauts hin

                  Codierknecht 1 Reply Last reply Reply Quote 0
                  • F
                    Fritzk @Asgothian last edited by

                    @asgothian Der Zähler zählt den Verbrauch. Aktueller Zählerstand ist mein Gaszählerstand. Der MemZählerstand wird um 23:58 gestetzt und nach dem berechne ich täglich fortlaufend den aktuellen verbrauch.
                    Am ende des tages 23:58 Uhr wird die differenz von MemZählerstand und Aktuellem Zählerstand in den Datenpunkt Verbrauch gestern geschrieben.

                    1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @Fritzk last edited by

                      @fritzk
                      Ich mache das mit 3 DP - sowohl für Gas als auch (angepasst) für Strom:

                      • "Laufender Tagesverbrauch" - wird über Tag bei jedem Impuls hochgezählt
                      • "Aktueller Zählerstand" - wird kontinuierlich hochgezählt
                      • "Berechneter Tagesverbrauch" wird in der Nacht geschrieben und per SQL historisiert

                      712859bd-ee60-4cfb-a49f-13f9e10f211c-image.png

                      Asgothian 1 Reply Last reply Reply Quote 0
                      • Asgothian
                        Asgothian Developer @Codierknecht last edited by Asgothian

                        @codierknecht sagte in Blockly täglichen Verbrauch hochzählen:

                        @fritzk
                        Ich mache das mit 3 DP - sowohl für Gas als auch (angepasst) für Strom:

                        • "Laufender Tagesverbrauch" - wird über Tag bei jedem Impuls hochgezählt
                        • "Aktueller Zählerstand" - wird kontinuierlich hochgezählt
                        • "Berechneter Tagesverbrauch" wird in der Nacht geschrieben und per SQL historisiert

                        712859bd-ee60-4cfb-a49f-13f9e10f211c-image.png

                        Frage: Wozu ist das Pause 1 Sek in deinem Blockly ?

                        Das hat keinen Effekt, da dahinter keine weiteren Anweisungen folgen. Selbst wenn du da ein Pause 20 Stunden rein schreiben würdest würden die Zählerstände munter aktualisieret werden. Das Skript würde Halt noch Ressourcen benötigen.

                        A.

                        Nachtrag1: Du hast einen Impulstrigger, @Fritzk hat einen Zählenden Trigger, deswegen ist das nicht zu 100% vergleichbar.
                        Nachtrag2: Den Zeitplan kann man sich sparen indem du (mit dem gleichen Baustein wie Dein "Wert") das Rücksetzen und Umsetzen im Trigger hinter einem Wenn (Wochentag(Vorheriger Zeitstempel)) != (Wochentag(Aktueller Zeitstempel)) Konstrukt versenkst. Das wird automatisch beim 1. Trigger des neuen Tages angestossen.
                        Nachtrag3: Die Abfrage auf "Falls Wert" kann weg wenn du auf "Ist grösser als vorher" Triggerst, denn: Wahr > Falsch 🙂

                        Codierknecht 1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 @Fritzk last edited by paul53

                          @fritzk sagte: Das ganze schaut so aus

                          Du hast alle Variablen - nur an der falschen Stelle gesetzt. Falsch ist auch "erhöhe Verbrauch". Vorschlag:

                          Bild_2022-12-20_135040061.png

                          F 1 Reply Last reply Reply Quote 0
                          • Codierknecht
                            Codierknecht Developer Most Active @Asgothian last edited by

                            @asgothian sagte in Blockly täglichen Verbrauch hochzählen:

                            Frage: Wozu ist das Pause 1 Sek in deinem Blockly ?
                            Das hat keinen Effekt, da dahinter keine weiteren Anweisungen folgen. Selbst wenn du da ein Pause 20 Stunden rein schreiben würdest würden die Zählerstände munter aktualisiert werden. Das Skript würde Halt noch Ressourcen benötigen.

                            Sollte zum Entprellen dienen.
                            In meiner Originalversion folgt darauf noch ein Debug - das habe ich hier der Einfachheit halber weggelassen.
                            Gibt's 'ne bessere Variante zum Entprellen?

                            Nachtrag2: Den Zeitplan kann man sich sparen indem du (mit dem gleichen Baustein wie Dein "Wert") das Rücksetzen und Umsetzen im Trigger hinter einem Wenn (Wochentag(Vorheriger Zeitstempel)) != (Wochentag(Aktueller Zeitstempel)) Konstrukt versenkst. Das wird automatisch beim 1. Trigger des neuen Tages angestossen.

                            Dann wäre der Verbrauch aber am falschen Tag protokolliert

                            Nachtrag3: Die Abfrage auf "Falls Wert" kann weg wenn du auf "Ist grösser als vorher" Triggerst, denn: Wahr > Falsch

                            OK - guter Punkt. Werde ich ändern.

                            Asgothian 1 Reply Last reply Reply Quote 0
                            • Asgothian
                              Asgothian Developer @Codierknecht last edited by Asgothian

                              @codierknecht sagte in Blockly täglichen Verbrauch hochzählen:

                              Frage: Wozu ist das Pause 1 Sek in deinem Blockly ?
                              Das hat keinen Effekt, da dahinter keine weiteren Anweisungen folgen. Selbst wenn du da ein Pause 20 Stunden rein schreiben würdest würden die Zählerstände munter aktualisiert werden. Das Skript würde Halt noch Ressourcen benötigen.

                              Sollte zum Entprellen dienen.
                              In meiner Originalversion folgt darauf noch ein Debug - das habe ich hier der Einfachheit halber weggelassen.
                              Gibt's 'ne bessere Variante zum Entprellen?

                              Wenn du entprellen willst dann brauchst du entweder einen Timeout und eine Variable oder eine geeignete Zeitabfrage (die ich inzwischen bevorzuge): Ich setze eine interne Variable "timestamp" am Anfang auf 0.
                              Dann folgt: falls Timestamp < aktueller Zeitstempel - x mache (Aktion nach trigger, setze Timestamp auf aktueller Zeitstempel)
                              x ist die Entprellzeit in ms.

                              Nachtrag2: Den Zeitplan kann man sich sparen indem du (mit dem gleichen Baustein wie Dein "Wert") das Rücksetzen und Umsetzen im Trigger hinter einem Wenn (Wochentag(Vorheriger Zeitstempel)) != (Wochentag(Aktueller Zeitstempel)) Konstrukt versenkst. Das wird automatisch beim 1. Trigger des neuen Tages angestossen.

                              Dann wäre der Verbrauch aber am falschen Tag protokolliert

                              Das Protokollieren am falschen Tag ist in der Theorie richtig - in der Praxis stellt sich die Frage wie du mit den DP weiter arbeitest. Solange du nur "Verbrauch heute" und "Verbrauch Gestern" in einer Visualisierung darstellst wird es eher nicht auffallen wenn innerhalb der ersten x Sekunden des Tages der Wert noch nicht stimmt.

                              A.

                              Codierknecht 1 Reply Last reply Reply Quote 1
                              • Codierknecht
                                Codierknecht Developer Most Active @Asgothian last edited by

                                @asgothian sagte in Blockly täglichen Verbrauch hochzählen:

                                Wenn du entprellen willst dann brauchst du entweder einen Timeout und eine Variable

                                Das habe ich mir beim Betrachten des Codes schon so gedacht.
                                Hier laufe ich sonst wohl in ein Asynchron-Problem, falls es wirklich zum Prellen kommt.
                                Werde ich mal umbauen.

                                @asgothian sagte in Blockly täglichen Verbrauch hochzählen:

                                Das Protokollieren am falschen Tag ist in der Theorie richtig - in der Praxis stellt sich die Frage wie du mit den DP weiter arbeitest. Solange du nur "Verbrauch heute" und "Verbrauch Gestern" in einer Visualisierung darstellst wird es eher nicht auffallen wenn innerhalb der ersten x Sekunden des Tages der Wert noch nicht stimmt.

                                Ich protokolliere den Verbrauch für die einzelnen Tage.
                                Wenn ich den Wert erst beim ersten Impuls eines Tages wegschreibe, landet er durch seinen Timestamp auf dem falschen Tag. Ist nicht kriegsentscheidend, aber verfälscht das Bild. Könnte man natürlich im SQL wieder zurechtbiegen.

                                1 Reply Last reply Reply Quote 0
                                • F
                                  Fritzk @paul53 last edited by

                                  @paul53 nur nochmal ne frage zum Verständniss. Der Verbrauch aktuell sollte ja dann auch um 23:58 Uhr auf null zurückgestellt werden ? Das ist ja dann mein Tagesverbrauch vom aktuellen Tag

                                  paul53 1 Reply Last reply Reply Quote 0
                                  • paul53
                                    paul53 @Fritzk last edited by

                                    @fritzk sagte: Der Verbrauch aktuell sollte ja dann auch um 23:58 Uhr auf null zurückgestellt werden ?

                                    Das kann man machen. Beim nächsten Zählimpuls fängt er ohnehin mit dem Wert einer Impulseinheit an.

                                    1 Reply Last reply Reply Quote 0
                                    • First post
                                      Last post

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    771
                                    Online

                                    31.9k
                                    Users

                                    80.3k
                                    Topics

                                    1.3m
                                    Posts

                                    5
                                    16
                                    818
                                    Loading More Posts
                                    • Oldest to Newest
                                    • Newest to Oldest
                                    • Most Votes
                                    Reply
                                    • Reply as topic
                                    Log in to reply
                                    Community
                                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                    The ioBroker Community 2014-2023
                                    logo