PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : HS: Eibmon in SQL



RoWo
16.08.06, 10:55
Hallo,

ich bin gerade am Basteln, die EIBMON-Liste in einen SQL-Server zu importieren - hat das schon jemand gemacht, kann ich von dessen Erfahrung bitte partizipieren?

Danke
Robert

JoergB
17.08.06, 10:28
Hallo Robert,

habe keine Ahnung, was eine EIBMON-Liste ist, kenne aber den SQL Server "wie meine Westentasche" :D.
Wo genau klemmt's denn?

Grüße,
Jörg

brachtendorf
17.08.06, 12:35
EIBMON ist eine EIB Monitorliste.

Wird im HS generiert und als HTML Tabelle dargestellt, oder als CSV Tabelle per Email versendet.

5000 Zeilen möglich. Eintragung der GAs incl. Datum und Zeit

Clemens.

JoergB
17.08.06, 12:39
CSV in eine SQL Server-Tabelle ist doch genau das, was er besonders schnell kann. Wo ist das Problem?

Aber das weisst Du vermutlich nicht Clemens, oder?

RoWo
17.08.06, 12:45
Hallo Jörg,

danke, das Problem ist, dass ich die Webseite alle Stunde nach neuen Daten abfragen will - geht als xml, http oder csv.
Irgendwie krieg ich den SQL nicht dazu die Webseite stündlich zu importieren und die Datensätze, die evtl. schon vorhanden sind, zu ignorieren.
Vielleicht hast Du ja einen Tipp für mich.

Danke
Grüsse
Robert

Matthias Schmidt
17.08.06, 12:46
Das Maximum sind übrigens 50.000 Zeilen.

Ich schätze mal, die Ursprungsfrage geht dahin, das automatisiert ablaufen zu lassen.

Sprich, ein Prozess fragt zyklisch die Liste ab und trägt die Werte in eine Datenbank ein.

Matthias Schmidt
17.08.06, 12:49
und die Datensätze, die evtl. schon vorhanden sind, zu ignorieren.


Das lässt sich kaum lösen, da du innerhalb derselben Sekunde mehrere Telegramme mit gleichen und unterschiedlichen Werten haben kannst. Wie willst du erkennen, ob es nun ein richtiges oder ein doppeltes Telegramm ist?

Ich habe schon vor längerer Zeit DACOM vorgeschlagen, die Telegramme in der Liste mit einem eindeutigen Schlüssel zu versehen, um genau dieses Problem zu umgehen. Mal sehen, vielleicht im nächsten Update.

JoergB
17.08.06, 13:02
Also, normalerweise löst man das mit einem "geschedulten" (ich liebe Anglizismen :D) DTS Paket. Aber ohne eindeutigen Schlüssel, wie Matthias schreibt, ist es schwierig, bereits enthaltene Daten zu erkennen.
Entweder man findet doch einen eindeutigen Schlüssel, in dem man mehrere Felder zusammen betrachtet oder man müsste die Tabelle immer komplett vor einem Import leeren...

Matthias Schmidt
17.08.06, 13:07
Also, normalerweise löst man das mit einem "geschedulten" (ich liebe Anglizismen :D) DTS Paket. Aber ohne eindeutigen Schlüssel, wie Matthias schreibt, ist es schwierig, bereits enthaltene Daten zu erkennen.
Entweder man findet doch einen eindeutigen Schlüssel, in dem man mehrere Felder zusammen betrachtet oder man müsste die Tabelle immer komplett vor einem Import leeren...

Ein Leeren der Tabelle ist nicht lmöglich.

(Und wenn, dann würde ich das NACH dem Import machen :D )

JoergB
17.08.06, 13:12
Ein Leeren der Tabelle ist nicht lmöglich.

(Und wenn, dann würde ich das NACH dem Import machen :D )Ich meinte das aus Sicht des SQL Servers. D.h. die SQL Server Tabelle immer vor dem nächsten Import zu löschen und dann den Inhalt der CSV Datei "reinschieben". Ich weiss ja nicht, wozu/wie lange die Daten im SQL Server gebraucht werden...

PeterH
17.08.06, 13:17
Das lässt sich kaum lösen, da du innerhalb derselben Sekunde mehrere Telegramme mit gleichen und unterschiedlichen Werten haben kannst. Wie willst du erkennen, ob es nun ein richtiges oder ein doppeltes Telegramm ist?

Das es keinen eindeutigen Schlüssel gibt ist Richtig.
Trotzdem kann man sich einen Schlüssel für den Import aus Grp.Adr. + Phys.Adr. + Wert bilden.
Es gehen dann nur Telegramme verloren die innerhalb einer Sekunde vom selben Teilnehmer mit dem selben Wert kommen.
(z.B. zykl. Sender < 1 Sekunde, oder nervöser Finger am Taster ;-)))

Will man Daten aber z.B. in einer Grafik auswerten könnte dieser Schlüssel trotzdem völlig ausreichen.

JoergB
17.08.06, 13:20
Kann nicht mal einer so 10-20 Zeilen aus so einer CSV Datei posten? Vielleicht wird es dann einfacher.

Matthias Schmidt
17.08.06, 13:28
17.08.2006 09:09:060/15510/6/151.1.48Writebc 11 30 06 0f d1 00811Bew OG
17.08.2006 09:09:080/15530/6/171.1.56Writebc 11 38 06 11 d1 00811Bew Kinderbad
17.08.2006 09:09:150/15510/6/151.1.48Writebc 11 30 06 0f d1 00811Bew OG
17.08.2006 09:09:170/15510/6/151.1.48Writebc 11 30 06 0f d1 00800Bew OG
17.08.2006 09:09:270/15530/6/171.1.56Writebc 11 38 06 11 d1 00811Bew Kinderbad
17.08.2006 09:09:343/5883/2/76HSWrite--00 000BadFBStell
17.08.2006 09:09:343/5903/2/78HSWrite--000BadFBMeldHz
17.08.2006 09:09:34100/60100/0/60SET0Beschattungsanf
17.08.2006 09:09:355/18245/7/321.2.7Writebc 12 07 2f 20 d5 0080 00 01 da a1121505Stromverbrauch

RoWo
17.08.06, 13:28
Aber gern:D :

"Datum+Uhrzeit";"GrpAdr.2";"GrpAdr.3";"PhysAdr.";"Op.";"Daten";"Wert(hex)";"Wert";"Bez."
"17.08.2006 12:26:44";"3/813";"3/3/45";"1.2.45";"Write";"bc 12 2d 1b 2d d2 00";"80 00";"0";"Heizung Bad Zusatzstufe"
"17.08.2006 12:26:51";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 65 12";"53166,08";"Helligkeit"
"17.08.2006 12:27:00";"0/40";"0/0/40";"HS";"Write";"--";"00 11 08 06";"17.08.2006";"Datum"
"17.08.2006 12:27:00";"0/41";"0/0/41";"HS";"Write";"--";"00 8c 1b 00";"12:27:00";"Zeit"
"17.08.2006 12:27:24";"7/778";"7/3/10";"1.2.71";"Write";"bc 12 47 3b 0a e1 00";"80";"0";"Status OG Bewegungsmelder"
"17.08.2006 12:27:34";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 66 24";"64389,12";"Helligkeit"
"17.08.2006 12:27:39";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 67 68";"77660,16";"Helligkeit"
"17.08.2006 12:27:41";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 6c 7d";"94126,08";"Helligkeit"
"17.08.2006 12:27:42";"7/778";"7/3/10";"1.2.71";"Write";"bc 12 47 3b 0a e1 00";"81";"1";"Status OG Bewegungsmelder"
"17.08.2006 12:27:44";"7/613";"7/2/101";"1.2.10";"Write";"bc 12 0a 3a 65 d2 00";"80 6a";"106";"Status Strom Herd L2"
"17.08.2006 12:27:50";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 67 26";"74956,8";"Helligkeit"
"17.08.2006 12:27:57";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 6c 5b";"91340,8";"Helligkeit"
"17.08.2006 12:27:58";"3/1281";"3/5/1";"1.2.115";"Write";"bc 12 73 1d 01 e3 00";"80 15 91";"57,0";"TrinkwasserTemp ist"
"17.08.2006 12:28:00";"0/40";"0/0/40";"HS";"Write";"--";"00 11 08 06";"17.08.2006";"Datum"
"17.08.2006 12:28:00";"0/41";"0/0/41";"HS";"Write";"--";"00 8c 1c 00";"12:28:00";"Zeit"
"17.08.2006 12:28:04";"7/613";"7/2/101";"1.2.10";"Write";"bc 12 0a 3a 65 d2 00";"80 6b";"107";"Status Strom Herd L2"
"17.08.2006 12:28:14";"7/613";"7/2/101";"1.2.10";"Write";"bc 12 0a 3a 65 d2 00";"80 6a";"106";"Status Strom Herd L2"
"17.08.2006 12:28:19";"0/1795";"0/7/3";"1.2.119";"Write";"bc 12 77 07 03 d3 00";"80 00 64";"1,0";"Windgeschwindigkeit"
"17.08.2006 12:28:25";"7/613";"7/2/101";"1.2.10";"Write";"bc 12 0a 3a 65 d2 00";"80 6b";"107";"Status Strom Herd L2"
"17.08.2006 12:28:30";"7/778";"7/3/10";"1.2.71";"Write";"bc 12 47 3b 0a e1 00";"80";"0";"Status OG Bewegungsmelder"
"17.08.2006 12:28:35";"7/778";"7/3/10";"1.2.71";"Write";"bc 12 47 3b 0a e1 00";"81";"1";"Status OG Bewegungsmelder"

RoWo
17.08.06, 13:30
@Matthias:

Wo sind Deine Anführungsstriche und die Semikolons? ;)

Matthias Schmidt
17.08.06, 13:34
Will man Daten aber z.B. in einer Grafik auswerten könnte dieser Schlüssel trotzdem völlig ausreichen.
:mad:
Dieses "könnte" ist genau mein Problem. Bei technischen Aufgabenstellungen hasse ich dieses Wort!

"Ihr Auto ist repariert. Es könnte funktionieren...." :D

JoergB
17.08.06, 13:37
Habe ich das richtig verstanden, dass die gleichen Zeilen beim nächsten Export wieder kommen können und zusätzlich neue hinzugekommen sind (und bei mehr als 50.000 Zeichen auch welche wegfallen)?

Matthias Schmidt
17.08.06, 13:37
Genau. So ist es. 50000 Zeilen, nicht Zeichen.

JoergB
17.08.06, 13:41
Ok, alles klar. Ich baue gerade mal was ;)

PeterH
17.08.06, 13:52
Dieses "könnte" ist genau mein Problem. Bei technischen Aufgabenstellungen hasse ich dieses Wort!

Also gut:

Wenn man absolute Werte auf einer Zeitachse darstellen möchte reicht dieser Schlüssel aus.

Wenn man Telegramme zählen möchte reicht dieser Schlüssel NICHT aus.

geht also auch ohne "könnte" ;-))

JoergB
17.08.06, 14:22
So, habe mal schnell ein DTS Paket gebaut. Robert kommst Du damit klar?

1. Das SQL Skript ausführen (vorher ggf. Pfade für die Datendateien anpassen) und damit eine Datenbank inkl. Tabellen erstellen
2. DTS Paket öffnen und
2. a) Den Pfad zur CSV Datei anpassen (Doppelklick auf's Icon)
2. b) Den SQL Server-Namen anpassen (Doppelklick auf's Icon)

Starten, freuen, wohlfühlen... :D

:mad: Das Paket ist zu groß zum Hochladen hier (=151 KB). Alternativen? :mad:

Matthias Schmidt
17.08.06, 14:29
Per Mail?

Könnte es auch auf meine Homepage stellen.

RoWo
17.08.06, 14:39
So, habe mal schnell ein DTS Paket gebaut. Robert kommst Du damit klar?

1. Das SQL Skript ausführen (vorher ggf. Pfade für die Datendateien anpassen) und damit eine Datenbank inkl. Tabellen erstellen
2. DTS Paket öffnen und
2. a) Den Pfad zur CSV Datei anpassen (Doppelklick auf's Icon)
2. b) Den SQL Server-Namen anpassen (Doppelklick auf's Icon)

Starten, freuen, wohlfühlen... :D

:mad: Das Paket ist zu groß zum Hochladen hier (=151 KB). Alternativen? :mad:

Super - Danke - allerdings zu Punkt 2a)
kann das auch eine Webseite sein? - Der Homeserver stellt die CSV-Datei per http zur Verfügung - sonst muss ich noch ein Script basteln, das dann jeweils bevor der SQL-Script läuft aus der HTML eine CSV-Datei macht.

Robert

Gaston
17.08.06, 14:59
Trotzdem kann man sich einen Schlüssel für den Import aus Grp.Adr. + Phys.Adr. + Wert bilden.

Es gehen dann nur Telegramme verloren die innerhalb einer Sekunde vom selben Teilnehmer mit dem selben Wert kommen.
(z.B. zykl. Sender < 1 Sekunde, oder nervöser Finger am Taster ;-)))


Es können bei diesem Schlüssel wichtige Telegramwiederholungen verloren gehen ausserdem wurde die Zeit im Schlüssel vergessen.

Besserer Schlüssel: Zeit+Telegram Headerbytes + Wert. Die entsprechenden Felder habe ich hier mal hervorgehoben:

"17.08.2006 12:27:34";"0/1793";"0/7/1";"1.2.119";"Write";"bc 12 77 07 01 d3 00";"80 66 24";"64389,12";"Helligkeit"

Somit geht höchstens eine Wiederholung verloren.

Allerdings können somit immer Wiederholungen verloren gehen nicht nur im Ausnahme fall. Besser wäre ein postprocessing zu machen da sich überschneidungen immer nur zwischen den X letzten Zeilen der vorherigen Daten und den X ersten der neuen Daten ergeben können.

Gruss,
Gaston

Gaston
17.08.06, 15:16
Hätte vieleicht noch schreiben können wie ich mir dieses Postprocessing vorstelle:

Also jede importierte Zeile enthält einen Autoincrement Schlüssel, nennen wir Ihn jetzt "Zeilennummer".

Import:


Zeilennummer der letzten Zeile in der DB merken (LZN)
Alle Zeilen importieren
Schlüssel der ersten neuen Zeile (LZN+1) innerhalb Zeilen 1-LZN suchen. Die Erste neue Zeile ENZ=LZN+1
Falls nicht gefunden: Keine Überlappung -> fertig
Beginend mit der letzten übereinstimmung (LÜ) wobei LÜ zwingend kleiner gleich LZN sein muss:
Der Schlüssel jeder Zeile von LÜ bis LZN, mit dem jeweiligen Schlüssel der entsprechenden Zeile im Bereich ENZ bis ENZ+(LZN-LÜ) überprüfen. Also Zeile LÜ mit ENZ testen (dieser Test ist ja eigentlich schon gemacht worden), LÜ+1 mit ENZ+1,...
Wenn eine nicht-Übereinstimmung gefunden wird dann vorherige übereinstimmung von der Zeile ENZ (falls vorhanden) benützen (LÜ wird dann diese Zeile) und ab Schritt 5 wiederholen.
Wenn alle Zeilen jeweils die gleichen sind dann handelt es sich um eine Überlappung und die ersten LZN-LÜ+1 Zeilen beginnend bei ENZ müssen wieder gelöscht werdenGruss,
Gaston

PeterH
17.08.06, 15:19
Die Zeit gehört natürlich in den Schlüssel.
War ein Flüchtigkeitsfehler meinerseits.

Da die Headerbytes bei internen Ko's und beim Senden des HS leer sind, sollte man aber trotzdem die Gruppenadresse mit in den Schlüssel aufnehmen.

Also falls es die Rechenleistung und der Speicherplatz hergeben, und man kein Postprocessing machen möchte :

Einfach alle Felder in den Schlüssel...

Gaston
17.08.06, 17:50
Die Zeit gehört natürlich in den Schlüssel.
War ein Flüchtigkeitsfehler meinerseits.


Hab Ich mir auch so gedacht.



Da die Headerbytes bei internen Ko's und beim Senden des HS leer sind, sollte man aber trotzdem die Gruppenadresse mit in den Schlüssel aufnehmen.

Arghh, da hast Du natürlich recht, also kommen wir zu der anderen Möglickeit...



Also falls es die Rechenleistung und der Speicherplatz hergeben, und man kein Postprocessing machen möchte :

Einfach alle Felder in den Schlüssel...

...an die ich auch gedacht hatte aber wegen dem Namen des KOs nicht genommen hatte. Aber in Anbetracht der obigen Feststellung ist dies wohl die beste Alternative.

Die kann man entweder über einen Schlüssel machen was dauerhaft mehr als den doppelten Speicherplatz frisst oder über eine temporäre DB mit SELECT DISTINCT ROW. Was wiederum rechenintensiv sein kann.

Gruss,
Gaston

RoWo
17.08.06, 19:07
Per Mail?

Könnte es auch auf meine Homepage stellen.

Hallo Matthias,

hast Du die Datei bekommen?
Wo liegt sie?

Robert

Matthias Schmidt
17.08.06, 20:09
Gerade unter HS-Tools auf meine HP

www.schmidt213.de/fra (http://www.schmidt213.de/fra)

JoergB
18.08.06, 08:21
Hätte vieleicht noch schreiben können wie ich mir dieses Postprocessing vorstelle:

Also jede importierte Zeile enthält einen Autoincrement Schlüssel, nennen wir Ihn jetzt "Zeilennummer".

Import:

Zeilennummer der letzten Zeile in der DB merken (LZN)
Alle Zeilen importieren
Schlüssel der ersten neuen Zeile (LZN+1) innerhalb Zeilen 1-LZN suchen. Die Erste neue Zeile ENZ=LZN+1
Falls nicht gefunden: Keine Überlappung -> fertig
Beginend mit der letzten übereinstimmung (LÜ) wobei LÜ zwingend kleiner gleich LZN sein muss:
Der Schlüssel jeder Zeile von LÜ bis LZN, mit dem jeweiligen Schlüssel der entsprechenden Zeile im Bereich ENZ bis ENZ+(LZN-LÜ) überprüfen. Also Zeile LÜ mit ENZ testen (dieser Test ist ja eigentlich schon gemacht worden), LÜ+1 mit ENZ+1,...
Wenn eine nicht-Übereinstimmung gefunden wird dann vorherige übereinstimmung von der Zeile ENZ (falls vorhanden) benützen (LÜ wird dann diese Zeile) und ab Schritt 5 wiederholen.
Wenn alle Zeilen jeweils die gleichen sind dann handelt es sich um eine Überlappung und die ersten LZN-LÜ+1 Zeilen beginnend bei ENZ müssen wieder gelöscht werden
Gruss,
Gaston

Also ich habe den Import so gestaltet, dass er sich insgesamt auf 2 mehr oder weniger identische (von der Struktur, nicht dem Inhalt) Tabellen verteilt. Die eine Tabelle enthält eine 1:1 Kopie der CSV Datei (ohne Schlüssel). Sie wird vor jedem Import geleert, dann befüllt mit dem Inhalt der CSV Datei. Tabelle 2 ist sozusagen meine Produktivtabelle, die fortlaufend wächst. Im nächsten Schritt werden in Tabelle 1 alle Datensätze, die bereits in der Produktivtabelle enthalten sind, gelöscht (vermeiden von Doubletten). Im letzten Schritt werden alle noch verbliebenen Daten aus Tabelle 1 in die Produktivtabelle übernommen.
Um Datensätze in der Produktivtabelle eindeutig spezifizieren zu können, enthält die Tabelle einen (künstlichen) Zählerschlüssel ;).

Grüße,
Jörg

JoergB
18.08.06, 08:25
Super - Danke - allerdings zu Punkt 2a)
kann das auch eine Webseite sein? - Der Homeserver stellt die CSV-Datei per http zur Verfügung - sonst muss ich noch ein Script basteln, das dann jeweils bevor der SQL-Script läuft aus der HTML eine CSV-Datei macht.

Robert
Hmmm, man kann einen FTP-Download aus einem DTS Paket durchführen oder auch ein VB-Skript aufrufen. Wie man aber zu den Daten kommt, weiss ich leider nicht. D.h. also, ich könnte das Skript zwar in das DTS Paket einbauen, aber nicht initial erstellen ;)

@Robert: Hast Du Dir das Paket mal angesehen? Kommst Du soweit klar?

Grüße,
Jörg

RoWo
18.08.06, 10:29
@Robert: Hast Du Dir das Paket mal angesehen? Kommst Du soweit klar?


Danke für das Paket - allerdings habe ich noch Probleme das DTS-Script in meinen SQL2005 zu importieren - aufführen geht allerdings nicht bearbeiten (ändern):o

Grüsse
Robert

JoergB
18.08.06, 11:07
Blöd :shithappe. Habe das Paket mit SQL 2000 erstellt. Muss mich mal schlau machen, ob ich irgendwo einen 2005er SQL Server habe.

@Edit: Roland hat das Paket inzwischen auf dem 2005er zum Laufen gebracht.

Gaston
18.08.06, 13:35
Blöd :shithappe. Habe das Paket mit SQL 2000 erstellt. Muss mich mal schlau machen, ob ich irgendwo einen 2005er SQL Server habe

Zwei Möglichkeiten bestehen um alte DTS Packeges auch auf dem SWLserver 2005 zu editieren.

Die eine Methode ist das SQL Server 2005 Feature Pack (http://www.microsoft.com/downloads/details.aspx?familyid=D09C1D60-A13C-4479-9B91-9E8B9D835CDC&displaylang=en) zu installieren und zwar speziell daraus die "Microsoft SQL Server 2000 DTS Designer Components".

Die zweite Möglichkeit ist den "Package Migration Wizard" auszuführen und die alten DTS Pakete nach SSIS zu migrieren, das DTS im SQLserver 2005 ablöst.

Gruss,
Gaston