Ankündigung

Einklappen
Keine Ankündigung bisher.

Eine CSV-Datei lesen und wiedergeben

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

    Eine CSV-Datei lesen und wiedergeben

    Einen schönen Sonntag an die Community,

    gerne würde ich wissen ob es möglich ist, den Inhalt einer CSV-Datei von OpenHAB lesen zu lassen und in der View widerzugeben.

    Dem geht ein Projekt voraus, welches die Struktur eines Smart Meters in Kombination mit OpenHAB auf dem Raspberry Pi aufzeigen soll. Leider möchte die Hochschule keinen echten Smart Meter kaufen, so dass einer simuliert werden muss.

    Im groben wäre mein Notebook der Smart Meter, auf dem eine Java Applikation alle 15 Minuten eine CSV-Datei erstellt. Inhalt: Datum, Uhrzeit, zufallsgenerierten kWh-Wert.

    #2
    Hallo,
    wenn die Datei auf einem Webserver liegt bzw. auf dem Webserver von openHAB abgelegt werden kann ist es möglich, diese per sendHttpGetRequest abzuholen und entsprechend zu parsen.
    Ich mach das z.b. mit dem Google Kalender ICS File, das lese ich komplett ein und parse mir die Werte heraus.
    Ob das auf einem RPi noch performant läuft kann ich allerdings nicht sagen.

    Holger

    Kommentar


      #3
      Danke für den Vorschlag, werde es sogleich ausprobieren.

      Kommentar


        #4
        Mal noch so als Starthilfe:
        Die Datei muss unter der URL aufrufbar sein, dein Browser fragt was er damit machen soll.
        Evtl. sind noch Imports notwendig z.b.
        import java.util.Arrays
        Ansonsten nochmal nachfragen...

        Code:
         
            var Integer i
            var Integer size
            var String[] lines
            var String[] line
            var String test = sendHttpGetRequest("http://192.168.0.70:81/static/test.csv")
        
            lines = test.split('\n') // Aufteilen in Zeilen
            size = lines.size()
            i = 0
        
                logInfo("rule","CSV: " + size +  " lines")
        
                while (i < size)
                {
                    logInfo("rule","CSV: " + lines.get(i))
                    line = lines.get(i).split(';') // Zeile am ; splitten
                    logInfo("rule","CSV0: " + line.get(0))
                    i = i +1
        }
        Holger

        Kommentar


          #5
          Nochmals danke

          Kommentar


            #6
            Es hat wunderbar funktioniert,

            versehen mit einem Timer, holt sich OpenHAB alle paar Sekunden die neuste CSV-Datei von einem http File Server. In der Konsole erscheint anschließend der entsprechende Datensatz.

            Gerne würde ich diese beim Aufrufen der sitemap wiedergeben. Leider brachte meine Suche in diese Richtung keinen Erfolg.

            Kommentar


              #7
              Was meinst du mit wiedergeben ? Die Werte anzeigen ?
              Dann musst du entsprechende Items erzeugen und deine Werte mit itemname.postUpdate(wert) updaten.

              Holger
              Zuletzt geändert von HolgerW; 20.07.2015, 15:34.

              Kommentar


                #8
                Beim Versuch den Inhalt auf meine Items zu verteilen erhalte ich folgende Fehlermeldungen:

                [WARN][.c.i.events.EventPublisherImpl]- given new state is NULL, couldn’t post update for ‘readDate‘
                [ERROR] [m.r.internal.egine.RuleEngine]-Error during the execution of start up rule ‘readCSV‘:1

                Was ich versuche
                Rules:
                Code:
                     
                [B]while[/B] (i < size)
                        {
                            [I]logInfo[/I]("rule","CSV: " + lines.get(i))
                            line = lines.get(i).split(';')
                            [I]logInfo[/I]("rule","CSV0: " + line.get(0))
                            line = lines.get(i).split(';')
                            [I]logInfo[/I]("rule","CSV1: " + line.get(1))
                            line = lines.get(i).split(';')
                            [I]logInfo[/I]("rule","CSV2: " + line.get(2))
                            readDate.[I]postUpdate[/I](lines.get(0))
                            readTime.[I]postUpdate[/I](lines.get(1))
                            kwh.[I]postUpdate[/I](lines.get(2))
                            i = i +1
                      }
                Items:
                Code:
                [B]DateTime[/B]    readDate    "Date [%1$tA, %1$[U]td[/U].%1$[U]tm[/U].%1$tY]"
                [B]DateTime[/B]    readTime    "Time [%1$tT]"
                [B]Number[/B] kwh

                Sitemap:
                Code:
                [B]Frame[/B] [B]label=[/B]"last update"{
                            [B]Text[/B] [B]item=[/B]readDate      [B]label=[/B]"Datum:"    [B]icon=[/B]"calendar"
                            [B]Text[/B] [B]item=[/B]readTime      [B]label=[/B]"[U]Uhrzeit[/U]:"  [B]icon=[/B]"clock-on"
                            [B]Text[/B] [B]item=[/B]kwh               [B]label=[/B]"kWh:"      [B]icon=[/B]"energy"
                           
                      }
                Ich würde gerne wissen wo mein fehler liegen könnte.

                Kommentar


                  #9
                  Also das hier
                  Code:
                  line = lines.get(i).split(';')
                  brauchst du nur einmal pro Zeile zu machen, "line" ist ein Array und enthält in line[0], line[1] usw. alle Werte einer Zeile.
                  Das sind allerding Strings, die kann man entweder als Text anzeigen oder die müssen erst in Date/Integer/Float umgewandelt werden.
                  Das geht für Float z.b. so (ungetestet)
                  Code:
                  var Number wert
                  wert = Float::parseFloat(line.get(4))
                  Test.postUpdate(wert)
                  Es kommt jetzt darauf an welche Werte /Formate deine CSV Datei enthält und was du mit den Werten machen willst, z.b. weitere Berechnungen.
                  Ich würde dir erstmal empfehlen die Werte als Strings anzuzeigen und dann zu prüfen was du damit machen willst.

                  Für weitere Fragen müsste man dann den Inhalt deiner Datei kennen, wie sieht ein Datum aus, wie Kommazahlen usw.

                  Holger

                  Kommentar


                    #10
                    Die einzelnen Datensätze aus der CSV habe ich in der String Form belassen, da ich keine Berechnungen oder Ähnliches durchführe. Anschließend übergab ich sie an die String Items.

                    Die CSV Datei hat nur eine Zeile mit Datum;Uhrzeit;kWh und wird alle 15 min überschrieben.
                    Nun werden diese Werte in der Sitemap angezeigt und in einem gewissen Zeitraum aktualisiert, wie geplant.

                    Nochmals vielen Dank für die Hilfe

                    Gruß Raimund

                    Kommentar

                    Lädt...
                    X