Seite 1 von 2

Nutzung von 2 Datenbanken im OH3

Verfasst: 19. Jul 2022 17:19
von MISPEZI
Hallo, mal wieder ein kleines Problem: Ich bin mit der RRDJ4 von 2.5 auf 3.0 migriert. Jetzt habe ich auch INFLUXDB aus Datenbank initialisiert.
Läuft auch alles soweit. Ich möchte einen Teil der Daten in die RRDJ4 und den anderen Teil in die INFLUXDB schreiben. Dazu hab ich einen Post gefunden,
der sich recht einfach las. Halt -logisch- 2 .persistence-Dateien anlegen und über Gruppen in den Einträgen steuern was wohin geschrieben wird. Geht nur leider nicht. Ich vermute mal das Problem liegt hier:
Entscheider.jpg
http://192.168.0.94:8080/settings/servi ... ersistence
Der Persistence Service, der verwendet werden soll, wenn kein anderer angegeben wurde.
Das ist wohl das Entscheidene. Nur wo gebe ich das an? Ich hoffe doch nicht in den rules sondern bei den items - von denen ich die meisten als .item-Datei habe. Und wie wäre dann auch noch 'ne Frage.

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 19. Jul 2022 17:56
von udo1toni
Nein, das ist nur der lesende Zugriff.

Aber der Reihe nach.
Punkt 1 ist, die Dateien müssen im Ordner /etc/openhab/persistence/ liegen.
Punkt 2: Die Dateien heißen für rrd4j exakt rrd4j.persist und für influxdb influxdb.persist.
Punkt 3: Die Form der Datei folgt diesem Schema:

Code: Alles auswählen

Strategies {
        // for rrd4j, we need a cron strategy
        everyMinute : "0 * * * * ?"
        
        default = everyMinute
}

Items {
        // let's store Wheater_Chart values in rrd4j
        Weather_Chart*                  : strategy = everyMinute, everyUpdate
        Gosund2Power                    : strategy = everyMinute, everyUpdate
}
Der erste Abschnitt, Strategies, definiert Time Cron Strategien. Hier z.B. everyMinute. Mit default werden die Strategies gesetzt, welche angewendet werden sollen, wenn keine Strategie angegeben ist.
Der zweite Abschnitt, Items, definiert, welche Items mit welcher Strategie gespeichert und abgerufen werden.
Dabei bedeutet das * am Ende, dass der Teil vor dem * ein vollständiger Name eines Gruppen Items ist, welches nicht selbst persistiert werden soll. Stattdessen werden dann die Member der Gruppe persistiert. Im oberen Beispiel werden also alle Items der Gruppe Weather_Chart und das Item Gosund2Power persistiert und sonst nichts. Der Stern ist KEINE Wildcard!
Ein alleinstehender * bedeutet, dass alle Items mit der angegebenen Strategie persistiert werden sollen.

Wenn Du für einen Persistence Service keine gültige Datei anlegst, werden einfach alle Items mit diesem Dienst persistiert, und zwar mit everyChange, everyUpdate und (mindestens im Fall von rrd4j) everyMinute.

Die Auswahl in der Main UI bezieht sich ausschließlich darauf, welcher Persistence Service als Quelle genutzt werden soll, wenn keiner angegeben ist. Das kommt vor allem in Rules und in Sitemaps zum Tragen, aber in Pages bzw. den zugehörigen Graphen Widgets kann man ebenfalls auswählen, aus welcher Quelle die Daten kommen sollen. Man kann beliebig Items von beliebigen Persistence Services persistieren lassen (auch von mehreren gleichzeitig). Aber immer im Hinterkopf behalten, dass es Services gibt, welche z.B. kein Text unterstützen, oder auch kein UoM usw... da muss man selbst drauf achten.
openHAB wird rigoros den Default Dienst anfragen oder eben den explizit angegebenen Dienst. Falls dort keine Daten anliegen, Pech gehabt.

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 20. Jul 2022 10:11
von MISPEZI
Danke für die schnelle Antwort. Die Anlage und Inhalt der .persistence Daten habe ist genau so gemacht. hier ist die influxdb.persistence:

Code: Alles auswählen

Strategies 
{
   everyMinute	: "0 * * * * ?"
   everyHour    : "0 0 * * * ?"
   everyDay     : "0 0 0 * * ?"
   default = everyChange
}
 
 
Items
    {
// Temperaturen und Temperaturwbweichungen für Diagramme    
        gInfluxdb* : strategy = everyMinute, restoreOnStartup
        }
Ich wollte alle Items, die in die Inflaxdb-Datenbank sollen dieser Gruppe zuordnen. Denke, das Problem ist, dass das Items sind, die explizit auch in der rrd4j.persistence stehen. Offensichtlich läßt das OH dann keine Speicherung eines Items in beiden Datenbanken zu.

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 20. Jul 2022 12:31
von udo1toni
Nein.
Nochmal, Du kannst beliebig viele Items in beliebig vielen Persistence Services gleichzeitig speichern, solange das Datenformat unterstützt wird.
restoreOnStartup ist allerdings gleich eine Strategie, die man nicht ohne Grund setzen sollte. Bitte nur Items per restoreOnStartup wiederherstellen, bei denen es nicht möglich ist, den Status vom System zu erfragen.
Auch ist everyMinute als Strategie bei InfluxDB weder notwendig noch unbedingt sinnvoll.
In Grafana kann man null-Werte ausblenden, bzw. durch Wiederholung des letzten Wertes auffüllen lassen. Störend sind fehlende Wiederholungen nur, wenn man extrem in die Daten hineinzoomt und dann im Ausschnitt keine Datenpunkte mehr hat. Andererseits sieht man dann, dass im entsprechenden Abschnitt keine Daten vorhanden sind, was auch nicht schlecht ist.

Bist Du denn sicher, dass openHAB überhaupt Kontakt zur InfluxDB hat? Man kann das beim Hochfahren des Systems im Log sehen.

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 20. Jul 2022 13:54
von MISPEZI
Hi, ja, Du hast vollkommen recht! Wenn man zu blöd zum Schreiben ist, sollte man zumindest mal in den log gucken!
(ich hab aus "openHABianDevice" ein "openHABinDevice" gemacht.
Trotzdem haben mir Deine Antworten beim Verständnis sehr geholfen - Danke nochmals

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 21. Jul 2022 17:29
von MISPEZI
Eine Frage bleibt am Ende doch noch. Du schreibst:
Die Auswahl in der Main UI bezieht sich ausschließlich darauf, welcher Persistence Service als Quelle genutzt werden soll, wenn keiner angegeben ist. Das kommt vor allem in Rules und in Sitemaps zum Tragen, aber in Pages bzw. den zugehörigen Graphen Widgets kann man ebenfalls auswählen, aus welcher Quelle die Daten kommen sollen
Bei Widget habe ich das gesehen, aber in z.B. den Rules weiß ist nicht wie das zu realisieren ist. Reicht wahrscheinlich nicht bei der Definition der Items in den Megadaten die Datenbank anzugeben. Für ein Beispiel wäre ich dankbar :D

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 21. Jul 2022 20:03
von udo1toni
Das kommt auf die Rule Engine an. Die Persistence wird als Parameter übergeben.
Dieser Parameter ist optional, wenn er nicht angegeben wird, verwendet openHAB halt den Default Wert aus der Konfiguration.

In den DSL Rules z.B. so:

Code: Alles auswählen

meinItem.changedSince(now.minusMinutes(1),"influxdb")
Alle Persistence Funktionen erlauben die Angabe der Persistence auf diese Weise.

Es gibt auch Funktionen, die meherere optionale Parameter haben. Der Name der Persistence ist immer der letzte Parameter, z.B.

Code: Alles auswählen

meinItem.previousState("true","rrd4j").state

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 21. Jul 2022 20:52
von MISPEZI
Mir geht es vor allem um die Item-Werte, die ich in der rule "sytemstart" hier ein Beispiel:

Code: Alles auswählen

rule "Rollos bei Systemstart"
    when 
        System started
    then 
    // Helfer ausschalten 
        MyHelper.postUpdate(OFF) 
        MyHelper1.postUpdate(OFF)
        MyHelp3.postUpdate(OFF)
    // Steuerung deaktivieren
        Auswahl_Steuerung.postUpdate(0)

    // Regeln aus Datenbank lesen
        gRS_REGEL.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            if (!(i.state instanceof Number)) {
                i.sendCommand(0)
                Myread = 0 
                logInfo("Systemstart","Regel für Re {} ist null", i.name.toString)
                telegramAction2.sendTelegram("Diese Regel wurde nicht geladen " + i.name.toString)

            }
            else {
                Myread = i.state as Number
            } 
            Mywrote = Myread.intValue
            i.postUpdate(Mywrote)
        ]
        logInfo("Systemstart", "Regeln zugewiesen")  

    // MQTT-Steuerung einschalten
        gRS_OUT.members.forEach[i|    
            i.sendCommand("event,MQTTControl=0" )   // Für alle ESPs MQTT-Steuerung ein
        ]    
        logInfo("Systemstart", "MQTT-Steuerung eingeschaltet")  

    // Rollostände aus Datenbank lesen
        gRS_RS.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            val StringBuilder strName = new StringBuilder
            val Myname = i.name.split("_")                  // für jedes Mitlied
            strName.append(Myname.get(0))                   // Namesfragment aufbauen
            strName.append("_")
            strName.append(Myname.get(1))
            strName.append("_")
            strName.append(Myname.get(2))
            val RE_Number = Myname.get(2)
            if (!(i.state instanceof Number)) {
                i.sendCommand(0.0)
                Myread = 0
                logInfo("Systemstart","Rollostand für Re {} ist null", i.name.toString)
                telegramAction2.sendTelegram("Dieser Rollostand wurde nicht geladen " + i.name.toString)
            }
            else {  
                Myread = i.state as Number
            }
            gRS_NAME.members.filter[k|k.name.startsWith(strName.toString)
                ].head.sendCommand(Myread * 10)           // .head -> das erste Item der Ergebnisliste
            logInfo("Systemstart", "Re {} Rollostand {} aus DB", RE_Number, Myread.toString)
        ]  
    // Gespeicherte Zeiten aus Datenbank lesen
        if (Start_WECKER_H.state as Number == NULL) Start_WECKER_H.postUpdate(5)
        if (Start_WECKER_M.state as Number == NULL) Start_WECKER_M.postUpdate(0)
        if (End_WECKER_H.state as Number == NULL) End_WECKER_H.postUpdate(12)
        if (End_WECKER_M.state as Number == NULL) End_WECKER_M.postUpdate(0)
        logInfo("Systemstart","Aufzeitkorrektur Sonnenzeit " + Auf_Korrek.state.toString)
        logInfo("Systemstart","Auf Sonne Stunden {} ; Minuten {}", Auf_h_It.state.toString, Auf_m_It.state.toString)
        logInfo("Systemstart","Zuzeitkorrektur Sonnenzeit " + Zu_Korrek.state.toString)
        logInfo("Systemstart","Zu Sonne Stunden {} ; Minuten {}", Zu_h_It.state.toString, Zu_m_It.state.toString)

    // Zeitberechnungwerte anstoßen
        MyHelp3.postUpdate(ON)

end     
Wenn ich die rrdj4 als Standart habe müßte ich also z.B schreiben:

Code: Alles auswählen

  
  ....
       gRS_REGEL.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            if (!(i.state instanceof Number)) {
            
            // ab hier neu
                var zwischen = i.previousState("true","influxdb").state
                i.sendCommand(zwischen)
            //bis hier neu  
                
                Myread = 0 
                logInfo("Systemstart","Regel für Re {} ist null", i.name.toString)
                telegramAction2.sendTelegram("Diese Regel wurde nicht geladen " + i.name.toString)

            }
 ....
 
Sehe ich das richtig so?

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 21. Jul 2022 21:44
von udo1toni
genau.

Re: Nutzung von 2 Datenbanken im OH3

Verfasst: 22. Jul 2022 16:56
von MISPEZI
Ich nochmal. Hab jetzt die Rollowerte in die Influxdb geschrieben und meine rule angepasst:

Code: Alles auswählen

var Number Myread
var Number Mywrote
var Number zw
val telegramAction2 = getActions("telegram","telegram:telegramBot:af7302d452")
// Allgemeine Rollosteuerung
// Regel für den Systemstart

rule "Rollos bei Systemstart"
    when 
        System started
    then 
    // Helfer ausschalten 
        MyHelper.postUpdate(OFF) 
        MyHelper1.postUpdate(OFF)
        MyHelp3.postUpdate(OFF)
    // Steuerung deaktivieren
        Auswahl_Steuerung.postUpdate(0)

    // Aufzeiten auf Items zuweisen
        RS_DGFL_01_UPT.postUpdate(28)     // Rollo  1 Flur oben Fahrzeit nach oben in Sec
        RS_DGFL_01_DWT.postUpdate(23)     // Rollo  1 Flur oben Fahrzeit nach unten in Sec
        RS_EGAZ_02_UPT.postUpdate(31)     // Rollo  2 Arbeitszimmer Fahrzeit nach oben in Sec
        RS_EGAZ_02_DWT.postUpdate(26)     // Rollo  2 Arbeitszimmer Fahrzeit nach unten in Sec
        RS_EGKF_03_UPT.postUpdate(31)     // Rollo  3 Küchenfenster Fahrzeit nach oben in Sec
        RS_EGKF_03_DWT.postUpdate(26)     // Rollo  3 Küchenfenster Fahrzeit nach unten in Sec
        RS_EGKT_04_UPT.postUpdate(31)     // Rollo  4 Küchentür Fahrzeit nach oben in Sec
        RS_EGKT_04_DWT.postUpdate(26)     // Rollo  4 Küchentür Fahrzeit nach unten in Sec
        RS_DGKN_05_UPT.postUpdate(33)     // Rollo  5 Kleines Zimmer Nord Fahrzeit nach oben in Sec
        RS_DGKN_05_DWT.postUpdate(28)     // Rollo  5 Kleines Zimmer Nord Fahrzeit nach unten in Sec
        RS_DGKW_06_UPT.postUpdate(33)     // Rollo  6 Kleines Zimmer West Fahrzeit nach oben in Sec
        RS_DGKW_06_DWT.postUpdate(28)     // Rollo  6 Kleines Zimmer West Fahrzeit nach unten in Sec
        RS_DGGL_07_UPT.postUpdate(33)     // Rollo  7 Großes Zimmer links Fahrzeit nach oben in Sec
        RS_DGGL_07_DWT.postUpdate(28)     // Rollo  7 Großes Zimmer links Fahrzeit nach unten in Sec
        RS_DGGR_08_UPT.postUpdate(33)     // Rollo  8 Großes Zimmer rechts Fahrzeit nach oben in Sec
        RS_DGGR_08_DWT.postUpdate(28)     // Rollo  8 Großes Zimmer rechts Fahrzeit nach unten in Sec
        RS_DGSZ_09_UPT.postUpdate(28)     // Rollo  9 Schlafzimmer Fahrzeit nach oben in Sec
        RS_DGSZ_09_DWT.postUpdate(23)     // Rollo  9 Schlafzimmer Fahrzeit nach unten in Sec
        RS_EGEZ_10_UPT.postUpdate(28)     // Rollo 10 Esszimmer Fahrzeit nach oben in Sec
        RS_EGEZ_10_DWT.postUpdate(23)     // Rollo 10 Esszimmer Fahrzeit nach unten in Sec

    // Regeln aus Datenbank lesen
        gRS_REGEL.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            zw = i.previousState(true,"influxdb").state as Number
            i.sendCommand(zw)
            if (!(i.state instanceof Number)) {
                i.sendCommand(0)
                Myread = 0 
                logInfo("Systemstart","Regel für Re {} ist null", i.name.toString)
                telegramAction2.sendTelegram("Diese Regel wurde nicht geladen " + i.name.toString)

            }
            else {
                Myread = i.state as Number
            } 
            Mywrote = Myread.intValue
            i.postUpdate(Mywrote)
        ]
        logInfo("Systemstart", "Regeln zugewiesen")  

    // MQTT-Steuerung einschalten
        gRS_OUT.members.forEach[i|    
            i.sendCommand("event,MQTTControl=0" )   // Für alle ESPs MQTT-Steuerung ein
        ]    
        logInfo("Systemstart", "MQTT-Steuerung eingeschaltet")  

    // Rollostände aus Datenbank lesen
        gRS_RS.members.forEach[i|  // Für alle RS mit Zeitsteuerung
            val StringBuilder strName = new StringBuilder
            val Myname = i.name.split("_")                  // für jedes Mitlied
            strName.append(Myname.get(0))                   // Namesfragment aufbauen
            strName.append("_")
            strName.append(Myname.get(1))
            strName.append("_")
            strName.append(Myname.get(2))
            val RE_Number = Myname.get(2)
            zw = i.previousState(true,"influxdb").state as Number
            i.sendCommand(zw)
            if (!(i.state instanceof Number)) {
                i.sendCommand(0.0)
                Myread = 0
                logInfo("Systemstart","Rollostand für Re {} ist null", i.name.toString)
                telegramAction2.sendTelegram("Dieser Rollostand wurde nicht geladen " + i.name.toString)
            }
            else {  
                Myread = i.state as Number
            }
            gRS_NAME.members.filter[k|k.name.startsWith(strName.toString)
                ].head.sendCommand(Myread * 10)           // .head -> das erste Item der Ergebnisliste
            logInfo("Systemstart", "Re {} Rollostand {} aus DB", RE_Number, Myread.toString)
        ]  
    // Gespeicherte Zeiten aus Datenbank lesen
        zw = Start_WECKER_H.previousState(true,"influxdb").state as Number
        Start_WECKER_H.postUpdate(zw) 
        if (Start_WECKER_H.state as Number == NULL) Start_WECKER_H.postUpdate(5)
        zw = Start_WECKER_M.previousState(true,"influxdb").state as Number
        Start_WECKER_M.postUpdate(zw) 
        if (Start_WECKER_M.state as Number == NULL) Start_WECKER_M.postUpdate(0)
        zw = End_WECKER_H.previousState(true,"influxdb").state as Number
        End_WECKER_H.postUpdate(zw) 
        if (End_WECKER_H.state as Number == NULL) End_WECKER_H.postUpdate(12)
        zw = End_WECKER_M.previousState(true,"influxdb").state as Number
        End_WECKER_M.postUpdate(zw) 
        if (End_WECKER_M.state as Number == NULL) End_WECKER_M.postUpdate(0)
        logInfo("Systemstart","Aufzeitkorrektur Sonnenzeit " + Auf_Korrek.state.toString)
        logInfo("Systemstart","Auf Sonne Stunden {} ; Minuten {}", Auf_h_It.state.toString, Auf_m_It.state.toString)
        logInfo("Systemstart","Zuzeitkorrektur Sonnenzeit " + Zu_Korrek.state.toString)
        logInfo("Systemstart","Zu Sonne Stunden {} ; Minuten {}", Zu_h_It.state.toString, Zu_m_It.state.toString)

    // Zeitberechnungwerte anstoßen
        MyHelp3.postUpdate(ON)

end     
Das log meldet einen null-Zustand in der Folgeregel shutter_com (Regel 1):
2022-07-22 16:28:09.848 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'shutter_com-1' failed: null in shutter_com, also in dieser:

Code: Alles auswählen

// Allgemeine Rollosteuerung
// Regel für das Update der Rollostellung
// Variablen
var String RE_Number                // Nummer des auslösenden Items
val telegramAction1 = getActions("telegram","telegram:telegramBot:d46a766c4d")

// Regel 1 --- ein ESP sendet Rollostand
rule " ein ESP sendet Rollostand"
    when
        Member of gRS_RS changed          // ein ESP sendet neuen Rollostand
    then 
        val StringBuilder strName = new StringBuilder
        val Myname = triggeringItem.name.split("_")
        strName.append(Myname.get(0))
        strName.append("_")
        strName.append(Myname.get(1))
        strName.append("_")
        strName.append(Myname.get(2))
        val RE_Number = Myname.get(2)
        val Myname2 = gRS_NAME.members.filter[l| l.name.startsWith(strName.toString)].head // .head -> das erste Item der Ergebnisliste
        if (Myname2 !== null) {              // wenn was gefunden wurde
            Myname2.postUpdate((triggeringItem.state as Number)*10)     
            logInfo("Rollo-Sendebetrieb","Rollo {} hat Wert {} gesendet", RE_Number, triggeringItem.state)
            telegramAction1.sendTelegram("R"+ RE_Number + " : Rollostand "+ triggeringItem.state.toString)
            if (RE_Number == "04") {   // Das Rollo an der Küchentür ist gefahren
                if (triggeringItem.state as Number > 0.9) { // Rollo ist zu
                    ESP_Disp_02_VALUE.sendCommand(25)   // Alarmanlage Automatikbetrieb ein
                }
                else if (triggeringItem.state < 0.1) {
                     alarm_overruled2.sendCommand(OFF)  // Alarmanlage Automatikbetrieb aus
                }
            }
        }
        else {
            logInfo("Rollo-Sendebetrieb","kein Item gefunden")
        }
end 
obwohl ich versuche, diesen null-Zustand abzufangen. Das steht in der Influxdb
time art item value
---- --- ---- -----
1658408651341000000 rs_regeln RS_DGFL_01_REGEL 1
1658408651346000000 rs_regeln RS_EGAZ_02_REGEL 1
1658408651347000000 rs_regeln RS_EGKF_03_REGEL 1
1658408651348000000 rs_regeln RS_EGKT_04_REGEL 2
1658408651349000000 rs_regeln RS_DGKN_05_REGEL 0
1658408651349000000 rs_regeln RS_DGKW_06_REGEL 0
1658408651350000000 rs_regeln RS_DGGL_07_REGEL 1
1658408651351000000 rs_regeln RS_DGGR_08_REGEL 1
1658408651352000000 rs_regeln RS_DGSZ_09_REGEL 0
1658408651353000000 rs_regeln RS_EGEZ_10_REGEL 1
1658411593291000000 rs_stand RS_DGFL_01_RS 0
1658411593292000000 rs_stand RS_EGAZ_02_RS 0
1658411593293000000 rs_stand RS_EGKF_03_RS 0
1658411593294000000 rs_stand RS_EGKT_04_RS 0
1658411593295000000 rs_stand RS_DGKN_05_RS 0
1658411593296000000 rs_stand RS_DGKW_06_RS 0
1658411593297000000 rs_stand RS_DGGL_07_RS 0
1658411593298000000 rs_stand RS_DGGR_08_RS 0
1658411593298000000 rs_stand RS_DGSZ_09_RS 3.7
1658411593299000000 rs_stand RS_EGEZ_10_RS 0
1658412787410000000 rs_timeset Start_WECKER_H 7
1658412787411000000 rs_regeln Start_WECKER_M 15
1658412787412000000 rs_regeln End_WECKER_H 22
1658412787413000000 rs_regeln End_WECKER_M 5
1658412787419000000 rs_regeln Auf_Korrek 120
1658412787420000000 rs_regeln Zu_Korrek 10
1658412787422000000 rs_regeln Auf_h_It 7
1658412787423000000 rs_regeln Auf_m_It 42
1658412787424000000 rs_regeln Zu_h_It 21
1658412787424000000 rs_regeln Zu_m_It 47
1658413032914000000 rs_timeset Start_WECKER_H 7
1658413032915000000 rs_timeset Start_WECKER_M 15
1658413032917000000 rs_timeset End_WECKER_H 22
1658413032918000000 rs_timeset End_WECKER_M 5
1658413032921000000 rs_timeset Auf_Korrek 120
1658413032922000000 rs_timeset Zu_Korrek 10
1658413032923000000 rs_timeset Auf_h_It 7
1658413032924000000 rs_timeset Auf_m_It 42
1658413032925000000 rs_timeset Zu_h_It 21
1658413032926000000 rs_timeset Zu_m_It 47
1658423660363000000 rs_timeset Start_WECKER_H 7
1658423660365000000 rs_timeset Start_WECKER_M 15
1658423660368000000 rs_timeset End_WECKER_H 22
1658423660369000000 rs_timeset End_WECKER_M 5
1658423660750000000 rs_timeset Auf_Korrek 120
1658423660751000000 rs_timeset Zu_Korrek 10
1658423660752000000 rs_timeset Auf_h_It 7
1658423660753000000 rs_timeset Auf_m_It 42
1658423660757000000 rs_timeset Zu_h_It 21
1658423660758000000 rs_timeset Zu_m_It 47
1658424970546000000 rs_stand RS_DGKN_05_RS 1.8
1658424982295000000 rs_stand RS_DGKW_06_RS 2
1658427310486000000 rs_stand RS_DGKN_05_RS 10
1658427322259000000 rs_stand RS_DGKW_06_RS 10
1658432160064000000 rs_timeset Zu_m_It 46
1658432796616000000 rs_stand RS_EGAZ_02_RS 10
1658432831527000000 rs_stand RS_DGGL_07_RS 10
1658432833639000000 rs_stand RS_EGKF_03_RS 10
1658432836161000000 rs_stand RS_DGGR_08_RS 10
1658432846571000000 rs_stand RS_DGFL_01_RS 10
1658433962423000000 rs_stand RS_EGKT_04_RS 10
1658439722276000000 rs_stand RS_EGKT_04_RS 0
1658439782307000000 rs_stand RS_EGKT_04_RS 10
1658461440111000000 rs_timeset Auf_m_It 44
1658466961671000000 rs_stand RS_EGKT_04_RS 0
1658468677760000000 rs_stand RS_EGAZ_02_RS 0
1658468711285000000 rs_stand RS_DGGL_07_RS 0
1658468713460000000 rs_stand RS_EGKF_03_RS 0
1658468714920000000 rs_stand RS_DGGR_08_RS 0
1658468727155000000 rs_stand RS_DGFL_01_RS 0
1658496742752000000 rs_stand RS_DGKW_06_RS 1.8
1658496789827000000 rs_stand RS_DGKN_05_RS 1.6
1658500089795000000 rs_stand RS_DGKN_05_RS 2.6
1658500102759000000 rs_stand RS_DGKW_06_RS 3
Frage ist nun wo das null herkommt, oder auch wie fange ich das wirkunsvoll ab