Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. Automatisierung
    5. SQL Wert-voriger Wert ausgeben

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    SQL Wert-voriger Wert ausgeben

    This topic has been deleted. Only users with topic management privileges can see it.
    • G
      GombersIOB @Mark last edited by GombersIOB

      @mark said in SQL Wert-voriger Wert ausgeben:

      ob man in SQL bei der Abfrage andere Werte ausgeben kann, als die, die in der Datenbank stehen?

      Man kann in der Query feste Werte vorgeben. Aber wozu dann eine Query? Werte auszugeben, die man nicht hat, ist schon schwieriger.
      Klingt nach einer Ansage, die ich mal in New Orleans im Fritzels (einer Jazz-Kneipe dort) gehört habe: "Wir spielen für $20 jedes Lied das wir kennen und für $100 auch die, die wir nicht kennen!"

      M 1 Reply Last reply Reply Quote 0
      • M
        Mark @GombersIOB last edited by

        @gombersiob ich logge:
        Id, timestamp, zaehlerstand
        1, 01.03.2023 (als timestamp), 68185
        2, 02.03.2023, 68192
        3, 03.03.2023, 68200

        Als Query soll dann
        02.03.23, 7 (also 68192-68185)
        03.03.23, 8
        erscheinen.

        Theoretische könnte ich die obige Anfrage an ein php-Skript übergeben und dort berechnen lassen. Dachte aber es wäre vielleicht auch direkt über sql möglich?

        Ro75 G D 3 Replies Last reply Reply Quote 0
        • Ro75
          Ro75 @Mark last edited by

          @mark Nochmal die Frage, was loggst du genau? Datenpunkt zum Beispiel wäre nicht schlecht.

          M 1 Reply Last reply Reply Quote 0
          • G
            GombersIOB @Mark last edited by GombersIOB

            @mark

            WHERE id=1

            mit dieser id muss

            1   01.03.2023  68185
            

            zurückkommen.

            Aber ich verstehe die Absicht - kann dabei leider nicht helfen. Ich würde die Logik im JavaScript abbilden. Eine Query zu bauen, die zwei Folgezeilen voneinander abzieht, das übersteigt meine Kenntnisse. Es geht, mit Google habe ich sowas ähnliches gefunden - aber es sieht recht komplex aus.
            Vor allen Dingen müsste man auch sicherstellen, dass zwei Folgezeilen auch zwei aufeinander folgende Tage sind - logging könnte ja auch mal ausgefallen sein.

            1 Reply Last reply Reply Quote 0
            • M
              Mark @Ro75 last edited by

              @ro75 Ich Schreibe im Blockly die Ausgelesenen Werte eines Smartmeters in Verschiedene Datenpunkte

              schedule("0 0 * * *", async function () {
                setState("0_userdata.0.Strom.Zaehlerstand.ZaehlerstandTagBeginnBezug"/*ZaehlerstandTagBeginnBezug*/, getState("smartmeter.0.1-0:1_8_0__255.value").val, true);
                setState("0_userdata.0.Strom.Zaehlerstand.ZaehlerstandTagBeginnEinspeisung"/*ZaehlerstandTagBeginnEinspeisung*/, getState("smartmeter.0.1-0:2_8_0__255.value").val, true);
                setState("0_userdata.0.Strom.Zaehlerstand.ZaehlerstandTagBeginnErzeugung"/*ZaehlerstandTagBeginnErzeugung*/, getState("smartmeter.1.1-0:2_8_0__255.value").val, true);
              });
              

              Diese Datenpunkte werden dann in der Datenbank gespeichert.
              19f8bbcd-85dc-4f23-a422-8409d9c2f994-grafik.png

              In der Abfrage suche ich nun alle mit ID=1 raus
              1dc8e622-867f-4c0b-a4f6-e3d2ff2394e5-grafik.png

              Und hier hätte ich gerne statt val jeweils die differenz zum vorigen Wert.

              Ro75 Azrael42 2 Replies Last reply Reply Quote 0
              • Ro75
                Ro75 @Mark last edited by

                @mark Dann benutze im SQL LIMIT 2. Damit bekommst du nur 2 Datensätze und dann damit eine Subtraktion ausführen.

                1 Reply Last reply Reply Quote 0
                • Azrael42
                  Azrael42 @Mark last edited by

                  @mark
                  Ist das Thema noch offen? Habe ich umgesetzt und funktioniert soweit bei mir. Recht fummelig, aber geht.

                  1 Reply Last reply Reply Quote 0
                  • D
                    diwoma @Mark last edited by

                    @mark Standard-SQL kann das glaube ich nicht.
                    Es hängt davon ab, welchen SQL-Server du verwendest. Bei MSSQL neuerer Generation gibt es einen Befehl, der auf die vorherige Datenzeile referenziert, das man den Wert für eine Subtraktion verwenden kann.

                    Azrael42 1 Reply Last reply Reply Quote 0
                    • Azrael42
                      Azrael42 @diwoma last edited by Azrael42

                      @diwoma
                      Schau dir mal Cursor Skripte an. Mit denen kannst du genau das erreichen. Gibt es seit gefühlt 20 Jahren. Zumindest bei MSSQL.
                      Was @marc hier machen will, kann man in dem Fall aber über ein "Group by" recht simpel erreicht werden:

                      select
                            cast(from_unixtime(ts / 1000) as date) AS Datum,
                            max(val) - min(val)  AS ErzeugungKWH
                               from
                                  ts_number 
                               where
                                  id = 173 
                                  -- and cast(from_unixtime(ts / 1000) as date) > cast(current_timestamp() as date) - interval 60 day 
                               group by
                                 1
                               order by
                                  1 desc
                      

                      In dem Beispiel hier, werden alle protokollierten Zählerstände meines Wechselrichters eines Tages gruppiert und der Min vom Max Wert subtrahiert. Geht natürlich mit jedem beliebigem Intervall.

                      Azrael42 1 Reply Last reply Reply Quote 0
                      • Azrael42
                        Azrael42 @Azrael42 last edited by Azrael42

                        Da ich gerade sowieso dran war, neue Datenpunkte für die Wärmepumpe zu erstellen, hier noch wie ich die SQL Daten in den IOBroker bekomme:

                        Als erstes lege ich der Einfachheit Halber eine View in der DB an.
                        (In HeidiSQL Rechtsklick auf die View -->Erstellen --> Neue View --> Statement von oben...)

                        Danach lege ich einen neuen Datenpunkt im IOBroker an

                        {
                          "common": {
                            "name": "WP_KWH_AUS",
                            "desc": "Manuell erzeugt",
                            "role": "state",
                            "type": "number",
                            "read": true,
                            "write": true,
                            "def": 0
                          },
                          "type": "state",
                          "native": {},
                          "from": "system.adapter.admin.0",
                          "user": "system.user.admin",
                          "ts": 1683869527657,
                          "_id": "0_userdata.0.Script.WP_KWH_AUS",
                          "acl": {
                            "object": 1636,
                            "state": 1636,
                            "owner": "system.user.admin",
                            "ownerGroup": "system.group.administrator"
                          }
                        }
                        

                        Zuletzt habe ich ein JScript am laufen, in dem die View abgefragt wird und den Wert auf den DP schreibt.

                        sendTo('sql.0', 'query', 'SELECT ErzeugungKWH Wert FROM iobroker.v_ErzeugungWPDaily WHERE DATE(Datum) = DATE (NOW())',function(result)
                        {
                        setState("0_userdata.0.Script.WP_KWH_AUS",Number(JSON.stringify(result.result[0].Wert)));
                        });
                        

                        Das wird dann über einen Sheduler jede Minute ausgeführt.

                        Grüße
                        Rich

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        963
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        5
                        12
                        565
                        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