From f820ca94a911f4979a2ff37d378dd6ac63ec8448 Mon Sep 17 00:00:00 2001 From: Mark Kors Date: Sun, 2 Nov 2025 10:41:41 +0100 Subject: [PATCH] first commit --- README.md | 135 ++++++++++++++ VAN_01971_Transactions.csv | 353 +++++++++++++++++++++++++++++++++++++ import_to_alfendb.py | 259 +++++++++++++++++++++++++++ 3 files changed, 747 insertions(+) create mode 100644 README.md create mode 100644 VAN_01971_Transactions.csv create mode 100644 import_to_alfendb.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..97b745f --- /dev/null +++ b/README.md @@ -0,0 +1,135 @@ +# Import naar Bestaande Database + +Aangepast importscript voor je bestaande `alfen` database met `transactions` tabel. + +## 📋 Wat doet het script? + +Het script importeert transacties uit je CSV bestand naar de bestaande `transactions` tabel: +- Leest `txstart2` regels (begin van laadsessie) +- Leest `txstop2` regels (einde van laadsessie) +- Slaat alleen complete transacties op (met start Ên stop) +- Slaat `mv` (meter value) regels over - deze worden niet in de tabel opgeslagen + +## 🚀 Gebruik + +### 1. Pas database credentials aan + +Open `import_to_existing_db.py` en wijzig regel 12-18: + +```python +DB_CONFIG = { + 'host': 'localhost', + 'user': 'your_username', # Jouw MySQL gebruiker + 'password': 'your_password', # Jouw MySQL wachtwoord + 'database': 'alfen', # Database naam (default: alfen) + 'charset': 'utf8mb4' +} +``` + +### 2. Installeer Python dependency (als nog niet gedaan) + +```bash +pip3 install mysql-connector-python +``` + +### 3. Voer import uit + +```bash +python3 import_to_existing_db.py VAN_01971_Transactions.csv +``` + +## 📊 Output Voorbeeld + +``` +============================================================ +Charging Station Data Importer +Import naar bestaande 'transactions' tabel +============================================================ + +✓ Database verbinding succesvol + +=== Import gestart: VAN_01971_Transactions.csv === + + → Transactie 0x0000000000000001 gestart (wacht op stop...) + ✓ Transactie 0x0000000000000001 opgeslagen (22.049 kWh) + → Transactie 0x000000001150e1e3 gestart (wacht op stop...) + ✓ Transactie 0x000000001150e1e3 opgeslagen (0.000 kWh) + → Transactie 0x000000006905d45d gestart (wacht op stop...) + ✓ Transactie 0x000000006905d45d opgeslagen (47.830 kWh) + +=== Import voltooid === +✓ Totaal regels verwerkt: 354 +✓ Transacties gestart: 3 +✓ Transacties gestopt: 3 +✓ Transacties opgeslagen: 3 + +=== Database Statistieken === +Totaal transacties in database: 686 +Totaal verbruik: 15234.567 kWh + +Laatste transactie: + ID: 0x000000006905d45d + Periode: 2025-10-31 16:40:37 - 2025-11-01 07:14:15 + Verbruik: 47.830 kWh + +✓ Database verbinding gesloten +``` + +## ✅ Functies + +- **Duplicaat detectie**: Controleert of transactie_id al bestaat +- **Complete transacties**: Slaat alleen op als zowel start als stop bekend zijn +- **Automatische berekening**: `total_kWh` wordt automatisch berekend +- **Error handling**: Duidelijke foutmeldingen bij problemen +- **Statistieken**: Toont overzicht na import + +## âš ī¸ Belangrijke Punten + +1. **Meter values worden genegeerd**: De `mv:` regels uit je CSV worden niet opgeslagen in de transactions tabel. Als je deze ook wil bewaren, laat het me weten en ik maak een aparte tabel voor meterwaarden. + +2. **Actieve transacties**: Als een transactie alleen een `txstart2` heeft maar nog geen `txstop2`, wordt deze NIET opgeslagen (staat als "pending"). + +3. **Duplicaten**: Als een `transaction_id` al bestaat in de database, wordt deze overgeslagen. + +## 🔍 Handige Queries + +Na import kun je bijvoorbeeld: + +```sql +-- Laatste 10 transacties +SELECT transaction_id, start_timestamp, stop_timestamp, total_kWh, card +FROM transactions +ORDER BY stop_timestamp DESC +LIMIT 10; + +-- Totaal verbruik per kaart +SELECT card, + COUNT(*) as aantal_sessies, + SUM(total_kWh) as totaal_kWh, + AVG(total_kWh) as gemiddeld_kWh +FROM transactions +GROUP BY card +ORDER BY totaal_kWh DESC; + +-- Verbruik per dag +SELECT DATE(start_timestamp) as datum, + COUNT(*) as aantal_sessies, + SUM(total_kWh) as totaal_kWh +FROM transactions +GROUP BY DATE(start_timestamp) +ORDER BY datum DESC; + +-- Sessies langer dan 8 uur +SELECT transaction_id, + start_timestamp, + stop_timestamp, + total_kWh, + TIMESTAMPDIFF(HOUR, start_timestamp, stop_timestamp) as uren +FROM transactions +WHERE TIMESTAMPDIFF(HOUR, start_timestamp, stop_timestamp) > 8 +ORDER BY uren DESC; +``` + +## 💡 Meterwaarden Ook Opslaan? + +Als je de tussentijdse meterwaarden (`mv:` regels) ook wil bewaren voor gedetailleerde analyse, kan ik een aanvullend script maken met een extra `meter_readings` tabel. Laat maar weten! \ No newline at end of file diff --git a/VAN_01971_Transactions.csv b/VAN_01971_Transactions.csv new file mode 100644 index 0000000..715793c --- /dev/null +++ b/VAN_01971_Transactions.csv @@ -0,0 +1,353 @@ +# Device, VAN_01971 +# Generated, 1-11-2025 10:36:53 +txstart2: id 0x0000000000000001, socket 1, 2025-10-28 18:27:42 5518.267kWh 04BB29EAFD0F94 3 2 Y +mv: socket 1, 2025-10-28 18:27:42 5518.267 Y +mv: socket 1, 2025-10-28 18:27:43 5518.267 Y +mv: socket 1, 2025-10-28 18:42:43 5518.796 Y +mv: socket 1, 2025-10-28 18:57:43 5518.796 Y +mv: socket 1, 2025-10-28 19:12:43 5518.796 Y +mv: socket 1, 2025-10-28 19:27:43 5518.796 Y +mv: socket 1, 2025-10-28 19:42:43 5518.796 Y +mv: socket 1, 2025-10-28 19:57:43 5518.796 Y +mv: socket 1, 2025-10-28 20:12:44 5518.796 Y +mv: socket 1, 2025-10-28 20:27:43 5518.796 Y +mv: socket 1, 2025-10-28 20:42:43 5518.796 Y +mv: socket 1, 2025-10-28 20:57:43 5518.796 Y +mv: socket 1, 2025-10-28 21:12:43 5518.796 Y +mv: socket 1, 2025-10-28 21:27:43 5518.796 Y +mv: socket 1, 2025-10-28 21:42:43 5518.796 Y +mv: socket 1, 2025-10-28 21:57:43 5518.796 Y +mv: socket 1, 2025-10-28 22:12:43 5518.796 Y +mv: socket 1, 2025-10-28 22:27:43 5518.796 Y +mv: socket 1, 2025-10-28 22:42:43 5518.796 Y +mv: socket 1, 2025-10-28 22:57:43 5518.796 Y +mv: socket 1, 2025-10-28 23:12:43 5518.796 Y +mv: socket 1, 2025-10-28 23:27:43 5518.796 Y +mv: socket 1, 2025-10-28 23:42:43 5518.796 Y +mv: socket 1, 2025-10-28 23:57:43 5518.796 Y +mv: socket 1, 2025-10-29 00:12:43 5518.796 Y +mv: socket 1, 2025-10-29 00:27:43 5518.796 Y +mv: socket 1, 2025-10-29 00:42:43 5518.796 Y +mv: socket 1, 2025-10-29 00:57:43 5518.796 Y +mv: socket 1, 2025-10-29 01:12:43 5520.027 Y +mv: socket 1, 2025-10-29 01:27:43 5522.283 Y +mv: socket 1, 2025-10-29 01:42:43 5522.836 Y +mv: socket 1, 2025-10-29 01:57:43 5522.945 Y +mv: socket 1, 2025-10-29 02:12:43 5525.658 Y +mv: socket 1, 2025-10-29 02:27:43 5526.141 Y +mv: socket 1, 2025-10-29 02:42:43 5526.457 Y +mv: socket 1, 2025-10-29 02:57:44 5529.181 Y +mv: socket 1, 2025-10-29 03:12:43 5531.738 Y +mv: socket 1, 2025-10-29 03:27:43 5534.453 Y +mv: socket 1, 2025-10-29 03:42:43 5537.169 Y +mv: socket 1, 2025-10-29 03:57:43 5539.881 Y +mv: socket 1, 2025-10-29 04:12:43 5540.121 Y +mv: socket 1, 2025-10-29 04:27:43 5540.121 Y +mv: socket 1, 2025-10-29 04:42:43 5540.121 Y +mv: socket 1, 2025-10-29 04:57:43 5540.121 Y +mv: socket 1, 2025-10-29 05:12:43 5540.121 Y +mv: socket 1, 2025-10-29 05:27:43 5540.121 Y +mv: socket 1, 2025-10-29 05:42:43 5540.121 Y +mv: socket 1, 2025-10-29 05:57:43 5540.121 Y +mv: socket 1, 2025-10-29 06:12:43 5540.121 Y +mv: socket 1, 2025-10-31 15:59:29 5540.316 Y +txstop2: id 0x0000000000000001, socket 1, 2025-10-31 15:59:29 5540.316kWh 04BB29EAFD0F94 6 5 Y +mv: socket 1, 2025-10-29 06:27:43 5540.316 Y +mv: socket 1, 2025-10-29 06:42:43 5540.316 Y +mv: socket 1, 2025-10-29 06:57:43 5540.316 Y +mv: socket 1, 2025-10-29 07:12:43 5540.316 Y +mv: socket 1, 2025-10-29 07:27:43 5540.316 Y +mv: socket 1, 2025-10-29 07:42:43 5540.316 Y +mv: socket 1, 2025-10-29 07:57:43 5540.316 Y +mv: socket 1, 2025-10-29 08:12:43 5540.316 Y +mv: socket 1, 2025-10-29 08:27:43 5540.316 Y +mv: socket 1, 2025-10-29 08:42:43 5540.316 Y +mv: socket 1, 2025-10-29 08:57:43 5540.316 Y +mv: socket 1, 2025-10-29 09:12:43 5540.316 Y +mv: socket 1, 2025-10-29 09:27:43 5540.316 Y +mv: socket 1, 2025-10-29 09:42:43 5540.316 Y +mv: socket 1, 2025-10-29 09:57:43 5540.316 Y +mv: socket 1, 2025-10-29 10:12:43 5540.316 Y +mv: socket 1, 2025-10-29 10:27:43 5540.316 Y +mv: socket 1, 2025-10-29 10:42:43 5540.316 Y +mv: socket 1, 2025-10-29 10:57:43 5540.316 Y +mv: socket 1, 2025-10-29 11:12:43 5540.316 Y +mv: socket 1, 2025-10-29 11:27:44 5540.316 Y +mv: socket 1, 2025-10-29 11:42:43 5540.316 Y +mv: socket 1, 2025-10-29 11:57:43 5540.316 Y +mv: socket 1, 2025-10-29 12:12:44 5540.316 Y +mv: socket 1, 2025-10-29 12:27:43 5540.316 Y +mv: socket 1, 2025-10-29 12:42:43 5540.316 Y +mv: socket 1, 2025-10-29 12:57:43 5540.316 Y +mv: socket 1, 2025-10-29 13:12:43 5540.316 Y +mv: socket 1, 2025-10-29 13:27:43 5540.316 Y +mv: socket 1, 2025-10-29 13:42:43 5540.316 Y +mv: socket 1, 2025-10-29 13:57:43 5540.316 Y +mv: socket 1, 2025-10-29 14:12:43 5540.316 Y +mv: socket 1, 2025-10-29 14:27:43 5540.316 Y +mv: socket 1, 2025-10-29 14:42:43 5540.316 Y +mv: socket 1, 2025-10-29 14:57:43 5540.316 Y +mv: socket 1, 2025-10-29 15:12:43 5540.316 Y +mv: socket 1, 2025-10-29 15:27:43 5540.316 Y +mv: socket 1, 2025-10-29 15:42:43 5540.316 Y +mv: socket 1, 2025-10-29 15:57:43 5540.316 Y +mv: socket 1, 2025-10-29 16:12:43 5540.316 Y +mv: socket 1, 2025-10-29 16:27:43 5540.316 Y +mv: socket 1, 2025-10-29 16:42:43 5540.316 Y +mv: socket 1, 2025-10-29 16:57:43 5540.316 Y +mv: socket 1, 2025-10-29 17:12:44 5540.316 Y +mv: socket 1, 2025-10-29 17:27:43 5540.316 Y +mv: socket 1, 2025-10-29 17:42:43 5540.316 Y +mv: socket 1, 2025-10-29 17:57:43 5540.316 Y +mv: socket 1, 2025-10-29 18:12:43 5540.316 Y +mv: socket 1, 2025-10-29 18:27:43 5540.316 Y +mv: socket 1, 2025-10-29 18:42:43 5540.316 Y +mv: socket 1, 2025-10-29 18:57:43 5540.316 Y +mv: socket 1, 2025-10-29 19:12:43 5540.316 Y +mv: socket 1, 2025-10-29 19:27:43 5540.316 Y +mv: socket 1, 2025-10-29 19:42:43 5540.316 Y +mv: socket 1, 2025-10-29 19:57:43 5540.316 Y +mv: socket 1, 2025-10-29 20:12:43 5540.316 Y +mv: socket 1, 2025-10-29 20:27:43 5540.316 Y +mv: socket 1, 2025-10-29 20:42:43 5540.316 Y +mv: socket 1, 2025-10-29 20:57:43 5540.316 Y +mv: socket 1, 2025-10-29 21:12:43 5540.316 Y +mv: socket 1, 2025-10-29 21:27:43 5540.316 Y +mv: socket 1, 2025-10-29 21:42:43 5540.316 Y +mv: socket 1, 2025-10-29 21:57:43 5540.316 Y +mv: socket 1, 2025-10-29 22:12:43 5540.316 Y +mv: socket 1, 2025-10-29 22:27:43 5540.316 Y +mv: socket 1, 2025-10-29 22:42:43 5540.316 Y +mv: socket 1, 2025-10-29 22:57:43 5540.316 Y +mv: socket 1, 2025-10-29 23:12:43 5540.316 Y +mv: socket 1, 2025-10-29 23:27:43 5540.316 Y +mv: socket 1, 2025-10-29 23:42:43 5540.316 Y +mv: socket 1, 2025-10-29 23:57:43 5540.316 Y +mv: socket 1, 2025-10-30 00:12:43 5540.316 Y +mv: socket 1, 2025-10-30 00:27:43 5540.316 Y +mv: socket 1, 2025-10-30 00:42:44 5540.316 Y +mv: socket 1, 2025-10-30 00:57:43 5540.316 Y +mv: socket 1, 2025-10-30 01:12:43 5540.316 Y +mv: socket 1, 2025-10-30 01:27:43 5540.316 Y +mv: socket 1, 2025-10-30 01:42:43 5540.316 Y +mv: socket 1, 2025-10-30 01:57:43 5540.316 Y +mv: socket 1, 2025-10-30 02:12:44 5540.316 Y +mv: socket 1, 2025-10-30 02:27:44 5540.316 Y +mv: socket 1, 2025-10-30 02:42:43 5540.316 Y +mv: socket 1, 2025-10-30 02:57:43 5540.316 Y +mv: socket 1, 2025-10-30 03:12:44 5540.316 Y +mv: socket 1, 2025-10-30 03:27:44 5540.316 Y +mv: socket 1, 2025-10-30 03:42:43 5540.316 Y +mv: socket 1, 2025-10-30 03:57:43 5540.316 Y +mv: socket 1, 2025-10-30 04:12:43 5540.316 Y +mv: socket 1, 2025-10-30 04:27:43 5540.316 Y +mv: socket 1, 2025-10-30 04:42:43 5540.316 Y +mv: socket 1, 2025-10-30 04:57:43 5540.316 Y +mv: socket 1, 2025-10-30 05:12:43 5540.316 Y +mv: socket 1, 2025-10-30 05:27:43 5540.316 Y +mv: socket 1, 2025-10-30 05:42:43 5540.316 Y +mv: socket 1, 2025-10-30 05:57:47 5540.316 Y +mv: socket 1, 2025-10-30 06:12:47 5540.316 Y +mv: socket 1, 2025-10-30 06:27:47 5540.316 Y +mv: socket 1, 2025-10-30 06:42:47 5540.316 Y +mv: socket 1, 2025-10-30 06:57:47 5540.316 Y +mv: socket 1, 2025-10-30 07:12:48 5540.316 Y +mv: socket 1, 2025-10-30 07:27:47 5540.316 Y +mv: socket 1, 2025-10-30 07:42:47 5540.316 Y +mv: socket 1, 2025-10-30 07:57:47 5540.316 Y +mv: socket 1, 2025-10-30 08:12:47 5540.316 Y +mv: socket 1, 2025-10-30 08:27:47 5540.316 Y +mv: socket 1, 2025-10-30 08:42:47 5540.316 Y +mv: socket 1, 2025-10-30 08:57:47 5540.316 Y +mv: socket 1, 2025-10-30 09:12:48 5540.316 Y +mv: socket 1, 2025-10-30 09:27:47 5540.316 Y +mv: socket 1, 2025-10-30 09:42:47 5540.316 Y +mv: socket 1, 2025-10-30 09:57:47 5540.316 Y +mv: socket 1, 2025-10-30 10:12:47 5540.316 Y +mv: socket 1, 2025-10-30 10:27:47 5540.316 Y +mv: socket 1, 2025-10-30 10:42:47 5540.316 Y +mv: socket 1, 2025-10-30 10:57:47 5540.316 Y +mv: socket 1, 2025-10-30 11:12:47 5540.316 Y +mv: socket 1, 2025-10-30 11:27:47 5540.316 Y +mv: socket 1, 2025-10-30 11:42:47 5540.316 Y +mv: socket 1, 2025-10-30 11:57:48 5540.316 Y +mv: socket 1, 2025-10-30 12:12:47 5540.316 Y +mv: socket 1, 2025-10-30 12:27:47 5540.316 Y +mv: socket 1, 2025-10-30 12:42:47 5540.316 Y +mv: socket 1, 2025-10-30 12:57:47 5540.316 Y +mv: socket 1, 2025-10-30 13:12:47 5540.316 Y +mv: socket 1, 2025-10-30 13:27:47 5540.316 Y +mv: socket 1, 2025-10-30 13:42:48 5540.316 Y +mv: socket 1, 2025-10-30 13:57:47 5540.316 Y +mv: socket 1, 2025-10-30 14:12:47 5540.316 Y +mv: socket 1, 2025-10-30 14:27:47 5540.316 Y +mv: socket 1, 2025-10-30 14:42:47 5540.316 Y +mv: socket 1, 2025-10-30 14:57:47 5540.316 Y +mv: socket 1, 2025-10-30 15:12:47 5540.316 Y +mv: socket 1, 2025-10-30 15:27:47 5540.316 Y +mv: socket 1, 2025-10-30 15:42:47 5540.316 Y +mv: socket 1, 2025-10-30 15:57:48 5540.316 Y +mv: socket 1, 2025-10-30 16:12:47 5540.316 Y +mv: socket 1, 2025-10-30 16:27:47 5540.316 Y +mv: socket 1, 2025-10-30 16:42:47 5540.316 Y +mv: socket 1, 2025-10-30 16:57:47 5540.316 Y +mv: socket 1, 2025-10-30 17:12:47 5540.316 Y +mv: socket 1, 2025-10-30 17:27:47 5540.316 Y +mv: socket 1, 2025-10-30 17:42:47 5540.316 Y +mv: socket 1, 2025-10-30 17:57:47 5540.316 Y +mv: socket 1, 2025-10-30 18:12:47 5540.316 Y +mv: socket 1, 2025-10-30 18:27:47 5540.316 Y +mv: socket 1, 2025-10-30 18:42:47 5540.316 Y +mv: socket 1, 2025-10-30 18:57:47 5540.316 Y +mv: socket 1, 2025-10-30 19:12:47 5540.316 Y +mv: socket 1, 2025-10-30 19:27:47 5540.316 Y +mv: socket 1, 2025-10-30 19:42:47 5540.316 Y +mv: socket 1, 2025-10-30 19:57:47 5540.316 Y +mv: socket 1, 2025-10-30 20:12:47 5540.316 Y +mv: socket 1, 2025-10-30 20:27:47 5540.316 Y +mv: socket 1, 2025-10-30 20:42:47 5540.316 Y +mv: socket 1, 2025-10-30 20:57:47 5540.316 Y +mv: socket 1, 2025-10-30 21:12:47 5540.316 Y +mv: socket 1, 2025-10-30 21:27:47 5540.316 Y +mv: socket 1, 2025-10-30 21:42:47 5540.316 Y +mv: socket 1, 2025-10-30 21:57:48 5540.316 Y +mv: socket 1, 2025-10-30 22:12:47 5540.316 Y +mv: socket 1, 2025-10-30 22:27:47 5540.316 Y +mv: socket 1, 2025-10-30 22:42:47 5540.316 Y +mv: socket 1, 2025-10-30 22:57:47 5540.316 Y +mv: socket 1, 2025-10-30 23:12:47 5540.316 Y +mv: socket 1, 2025-10-30 23:27:47 5540.316 Y +mv: socket 1, 2025-10-30 23:42:47 5540.316 Y +mv: socket 1, 2025-10-30 23:57:47 5540.316 Y +mv: socket 1, 2025-10-31 00:12:47 5540.316 Y +mv: socket 1, 2025-10-31 00:27:47 5540.316 Y +mv: socket 1, 2025-10-31 00:42:48 5540.316 Y +mv: socket 1, 2025-10-31 00:57:48 5540.316 Y +mv: socket 1, 2025-10-31 01:12:47 5540.316 Y +mv: socket 1, 2025-10-31 01:27:47 5540.316 Y +mv: socket 1, 2025-10-31 01:42:47 5540.316 Y +mv: socket 1, 2025-10-31 01:57:47 5540.316 Y +mv: socket 1, 2025-10-31 02:12:47 5540.316 Y +mv: socket 1, 2025-10-31 02:27:47 5540.316 Y +mv: socket 1, 2025-10-31 02:42:47 5540.316 Y +mv: socket 1, 2025-10-31 02:57:47 5540.316 Y +mv: socket 1, 2025-10-31 03:12:47 5540.316 Y +mv: socket 1, 2025-10-31 03:27:47 5540.316 Y +mv: socket 1, 2025-10-31 03:42:47 5540.316 Y +mv: socket 1, 2025-10-31 03:57:48 5540.316 Y +mv: socket 1, 2025-10-31 04:12:47 5540.316 Y +mv: socket 1, 2025-10-31 04:27:47 5540.316 Y +mv: socket 1, 2025-10-31 04:42:47 5540.316 Y +mv: socket 1, 2025-10-31 04:57:47 5540.316 Y +mv: socket 1, 2025-10-31 05:12:47 5540.316 Y +mv: socket 1, 2025-10-31 05:27:47 5540.316 Y +mv: socket 1, 2025-10-31 05:42:47 5540.316 Y +mv: socket 1, 2025-10-31 05:57:47 5540.316 Y +mv: socket 1, 2025-10-31 06:12:47 5540.316 Y +mv: socket 1, 2025-10-31 06:27:47 5540.316 Y +mv: socket 1, 2025-10-31 06:42:47 5540.316 Y +mv: socket 1, 2025-10-31 06:57:47 5540.316 Y +mv: socket 1, 2025-10-31 07:12:47 5540.316 Y +mv: socket 1, 2025-10-31 07:27:47 5540.316 Y +mv: socket 1, 2025-10-31 07:42:47 5540.316 Y +mv: socket 1, 2025-10-31 07:57:47 5540.316 Y +mv: socket 1, 2025-10-31 08:12:47 5540.316 Y +mv: socket 1, 2025-10-31 08:27:47 5540.316 Y +mv: socket 1, 2025-10-31 08:42:47 5540.316 Y +mv: socket 1, 2025-10-31 08:57:47 5540.316 Y +mv: socket 1, 2025-10-31 09:12:47 5540.316 Y +mv: socket 1, 2025-10-31 09:27:47 5540.316 Y +mv: socket 1, 2025-10-31 09:42:47 5540.316 Y +mv: socket 1, 2025-10-31 09:57:47 5540.316 Y +mv: socket 1, 2025-10-31 10:12:48 5540.316 Y +mv: socket 1, 2025-10-31 10:27:47 5540.316 Y +mv: socket 1, 2025-10-31 10:42:47 5540.316 Y +mv: socket 1, 2025-10-31 10:57:47 5540.316 Y +mv: socket 1, 2025-10-31 11:12:47 5540.316 Y +mv: socket 1, 2025-10-31 11:27:47 5540.316 Y +mv: socket 1, 2025-10-31 11:42:47 5540.316 Y +mv: socket 1, 2025-10-31 11:57:47 5540.316 Y +mv: socket 1, 2025-10-31 12:12:47 5540.316 Y +mv: socket 1, 2025-10-31 12:27:47 5540.316 Y +mv: socket 1, 2025-10-31 12:42:47 5540.316 Y +mv: socket 1, 2025-10-31 12:57:47 5540.316 Y +mv: socket 1, 2025-10-31 13:12:48 5540.316 Y +mv: socket 1, 2025-10-31 13:27:47 5540.316 Y +mv: socket 1, 2025-10-31 13:42:47 5540.316 Y +mv: socket 1, 2025-10-31 13:57:47 5540.316 Y +mv: socket 1, 2025-10-31 14:12:47 5540.316 Y +mv: socket 1, 2025-10-31 14:27:47 5540.316 Y +mv: socket 1, 2025-10-31 14:42:47 5540.316 Y +mv: socket 1, 2025-10-31 14:57:47 5540.316 Y +mv: socket 1, 2025-10-31 15:12:47 5540.316 Y +mv: socket 1, 2025-10-31 15:27:47 5540.316 Y +mv: socket 1, 2025-10-31 15:42:47 5540.316 Y +mv: socket 1, 2025-10-31 15:57:47 5540.316 Y +txstart2: id 0x000000001150e1e3, socket 1, 2025-10-31 16:30:50 5540.316kWh 04BB29EAFD0F94 3 2 Y +mv: socket 1, 2025-10-31 16:30:50 5540.316 Y +mv: socket 1, 2025-10-31 16:30:52 5540.316 Y +mv: socket 1, 2025-10-31 16:34:42 5540.316 Y +txstop2: id 0x000000001150e1e3, socket 1, 2025-10-31 16:34:42 5540.316kWh 04BB29EAFD0F94 6 5 Y +txstart2: id 0x000000006905d45d, socket 1, 2025-10-31 16:40:37 5540.316kWh 04BB29EAFD0F94 3 2 Y +mv: socket 1, 2025-10-31 16:40:37 5540.316 Y +mv: socket 1, 2025-10-31 16:40:39 5540.316 Y +mv: socket 1, 2025-10-31 16:55:38 5542.386 Y +mv: socket 1, 2025-10-31 17:10:39 5544.580 Y +mv: socket 1, 2025-10-31 17:25:38 5546.672 Y +mv: socket 1, 2025-10-31 17:40:38 5548.035 Y +mv: socket 1, 2025-10-31 17:55:38 5548.035 Y +mv: socket 1, 2025-10-31 18:10:38 5548.035 Y +mv: socket 1, 2025-10-31 18:25:38 5548.035 Y +mv: socket 1, 2025-10-31 18:40:38 5548.035 Y +mv: socket 1, 2025-10-31 18:55:38 5548.035 Y +mv: socket 1, 2025-10-31 19:10:38 5548.035 Y +mv: socket 1, 2025-10-31 19:25:38 5548.035 Y +mv: socket 1, 2025-10-31 19:40:39 5548.035 Y +mv: socket 1, 2025-10-31 19:55:38 5548.035 Y +mv: socket 1, 2025-10-31 20:10:38 5548.035 Y +mv: socket 1, 2025-10-31 20:25:38 5548.035 Y +mv: socket 1, 2025-10-31 20:40:38 5548.035 Y +mv: socket 1, 2025-10-31 20:55:38 5548.035 Y +mv: socket 1, 2025-10-31 21:10:38 5548.035 Y +mv: socket 1, 2025-10-31 21:25:38 5548.035 Y +mv: socket 1, 2025-10-31 21:40:38 5548.035 Y +mv: socket 1, 2025-10-31 21:55:38 5548.035 Y +mv: socket 1, 2025-10-31 22:10:38 5548.035 Y +mv: socket 1, 2025-10-31 22:25:38 5548.035 Y +mv: socket 1, 2025-10-31 22:40:38 5548.035 Y +mv: socket 1, 2025-10-31 22:55:38 5548.035 Y +mv: socket 1, 2025-10-31 23:10:38 5548.035 Y +mv: socket 1, 2025-10-31 23:25:39 5548.035 Y +mv: socket 1, 2025-10-31 23:40:38 5548.035 Y +mv: socket 1, 2025-10-31 23:55:38 5548.035 Y +mv: socket 1, 2025-11-01 00:10:38 5548.621 Y +mv: socket 1, 2025-11-01 00:25:39 5548.621 Y +mv: socket 1, 2025-11-01 00:40:38 5548.621 Y +mv: socket 1, 2025-11-01 00:55:38 5548.621 Y +mv: socket 1, 2025-11-01 01:10:38 5549.452 Y +mv: socket 1, 2025-11-01 01:25:38 5551.081 Y +mv: socket 1, 2025-11-01 01:40:38 5553.323 Y +mv: socket 1, 2025-11-01 01:55:38 5555.846 Y +mv: socket 1, 2025-11-01 02:10:38 5558.138 Y +mv: socket 1, 2025-11-01 02:25:38 5560.275 Y +mv: socket 1, 2025-11-01 02:40:38 5562.812 Y +mv: socket 1, 2025-11-01 02:55:38 5563.678 Y +mv: socket 1, 2025-11-01 03:10:38 5564.969 Y +mv: socket 1, 2025-11-01 03:25:38 5567.483 Y +mv: socket 1, 2025-11-01 03:40:38 5570.004 Y +mv: socket 1, 2025-11-01 03:55:38 5571.247 Y +mv: socket 1, 2025-11-01 04:10:38 5571.836 Y +mv: socket 1, 2025-11-01 04:25:38 5573.281 Y +mv: socket 1, 2025-11-01 04:40:38 5574.919 Y +mv: socket 1, 2025-11-01 04:55:38 5576.427 Y +mv: socket 1, 2025-11-01 05:10:38 5578.320 Y +mv: socket 1, 2025-11-01 05:25:38 5580.255 Y +mv: socket 1, 2025-11-01 05:40:38 5582.202 Y +mv: socket 1, 2025-11-01 05:55:38 5584.129 Y +mv: socket 1, 2025-11-01 06:10:38 5586.061 Y +mv: socket 1, 2025-11-01 06:25:39 5587.987 Y +mv: socket 1, 2025-11-01 06:40:38 5588.146 Y +mv: socket 1, 2025-11-01 06:55:38 5588.146 Y +mv: socket 1, 2025-11-01 07:10:38 5588.146 Y +mv: socket 1, 2025-11-01 07:14:15 5588.146 Y +txstop2: id 0x000000006905d45d, socket 1, 2025-11-01 07:14:15 5588.146kWh 04BB29EAFD0F94 6 5 Y diff --git a/import_to_alfendb.py b/import_to_alfendb.py new file mode 100644 index 0000000..44f85e3 --- /dev/null +++ b/import_to_alfendb.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python3 +""" +Import charging station transaction data from CSV to existing MySQL database +Aangepast voor bestaande 'transactions' tabel structuur +""" + +import re +import mysql.connector +from datetime import datetime +from decimal import Decimal +import sys + +# Database configuration +DB_CONFIG = { + 'host': '192.168.178.201', + 'port': 3307, + 'user': 'alfen_user', + 'password': '5uVgr%f%s2P5GR@3q!', + 'database': 'alfen', # Jouw database naam + 'charset': 'utf8mb4' +} + +class ChargingDataImporter: + def __init__(self, config): + self.config = config + self.conn = None + self.cursor = None + self.pending_transactions = {} # Track transactions waiting for stop + + def connect(self): + """Connect to MySQL database""" + try: + self.conn = mysql.connector.connect(**self.config) + self.cursor = self.conn.cursor() + print("✓ Database verbinding succesvol") + except mysql.connector.Error as err: + print(f"✗ Fout bij verbinden met database: {err}") + sys.exit(1) + + def close(self): + """Close database connection""" + if self.cursor: + self.cursor.close() + if self.conn: + self.conn.close() + + def parse_txstart(self, line): + """Parse transaction start line and store temporarily""" + # txstart2: id 0x0000000000000001, socket 1, 2025-10-28 18:27:42 5518.267kWh 04BB29EAFD0F94 3 2 Y + pattern = r'txstart2: id (0x[0-9a-fA-F]+), socket (\d+), ([\d-]+ [\d:]+) ([\d.]+)kWh (\w+)' + match = re.match(pattern, line) + + if match: + tx_id = match.group(1) # Keep as hex string + socket_num = int(match.group(2)) + timestamp = datetime.strptime(match.group(3), '%Y-%m-%d %H:%M:%S') + kwh = Decimal(match.group(4)) + card = match.group(5) + + # Store temporarily until we get the stop + self.pending_transactions[tx_id] = { + 'transaction_id': tx_id, + 'socket': socket_num, + 'start_timestamp': timestamp, + 'start_kWh': kwh, + 'card': card + } + + print(f" → Transactie {tx_id} gestart (wacht op stop...)") + return True + return False + + def parse_txstop(self, line): + """Parse transaction stop line and insert complete transaction""" + # txstop2: id 0x0000000000000001, socket 1, 2025-10-31 15:59:29 5540.316kWh 04BB29EAFD0F94 6 5 Y + pattern = r'txstop2: id (0x[0-9a-fA-F]+), socket (\d+), ([\d-]+ [\d:]+) ([\d.]+)kWh' + match = re.match(pattern, line) + + if match: + tx_id = match.group(1) + socket_num = int(match.group(2)) + timestamp = datetime.strptime(match.group(3), '%Y-%m-%d %H:%M:%S') + kwh = Decimal(match.group(4)) + + # Check if we have the start for this transaction + if tx_id not in self.pending_transactions: + print(f" ⚠ Stop gevonden voor {tx_id} maar geen start - overgeslagen") + return False + + tx_data = self.pending_transactions[tx_id] + + # Calculate total consumption + total_kwh = kwh - tx_data['start_kWh'] + + try: + # Check if transaction already exists + self.cursor.execute( + "SELECT id FROM transactions WHERE transaction_id = %s", + (tx_id,) + ) + existing = self.cursor.fetchone() + + if existing: + print(f" ⚠ Transactie {tx_id} bestaat al - overgeslagen") + del self.pending_transactions[tx_id] + return False + + # Insert complete transaction + self.cursor.execute(""" + INSERT INTO transactions + (transaction_id, socket, start_timestamp, start_kWh, + stop_timestamp, stop_kWh, total_kWh, card) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s) + """, ( + tx_id, + tx_data['socket'], + tx_data['start_timestamp'], + tx_data['start_kWh'], + timestamp, + kwh, + total_kwh, + tx_data['card'] + )) + + self.conn.commit() + + # Remove from pending + del self.pending_transactions[tx_id] + + print(f" ✓ Transactie {tx_id} opgeslagen ({total_kwh:.3f} kWh)") + return True + + except mysql.connector.Error as err: + print(f" ✗ Fout bij opslaan transactie {tx_id}: {err}") + return False + + return False + + def import_file(self, filepath): + """Import CSV file into database""" + print(f"\n=== Import gestart: {filepath} ===\n") + + line_count = 0 + tx_start_count = 0 + tx_stop_count = 0 + tx_saved_count = 0 + + try: + with open(filepath, 'r') as file: + for line_num, line in enumerate(file, 1): + line = line.strip() + + # Skip empty lines and comments + if not line or line.startswith('# Generated'): + continue + + line_count += 1 + + # Parse transaction start + if line.startswith('txstart2:'): + if self.parse_txstart(line): + tx_start_count += 1 + + # Parse transaction stop + elif line.startswith('txstop2:'): + if self.parse_txstop(line): + tx_stop_count += 1 + tx_saved_count += 1 + + # Skip meter values (mv:) - niet opgeslagen in deze tabel + elif line.startswith('mv:'): + continue + + print(f"\n=== Import voltooid ===") + print(f"✓ Totaal regels verwerkt: {line_count}") + print(f"✓ Transacties gestart: {tx_start_count}") + print(f"✓ Transacties gestopt: {tx_stop_count}") + print(f"✓ Transacties opgeslagen: {tx_saved_count}") + + # Check for incomplete transactions + if self.pending_transactions: + print(f"\n⚠ Let op: {len(self.pending_transactions)} transactie(s) nog actief (geen stop gevonden):") + for tx_id in self.pending_transactions: + print(f" - {tx_id}") + + # Show summary statistics + self.show_statistics() + + except FileNotFoundError: + print(f"✗ Bestand niet gevonden: {filepath}") + sys.exit(1) + except Exception as err: + print(f"✗ Onverwachte fout: {err}") + import traceback + traceback.print_exc() + self.conn.rollback() + sys.exit(1) + + def show_statistics(self): + """Show database statistics after import""" + print("\n=== Database Statistieken ===") + + # Total transactions + self.cursor.execute("SELECT COUNT(*) FROM transactions") + total_tx = self.cursor.fetchone()[0] + print(f"Totaal transacties in database: {total_tx}") + + # Total consumption + self.cursor.execute("SELECT SUM(total_kWh) FROM transactions") + result = self.cursor.fetchone() + total_consumption = result[0] if result[0] else 0 + print(f"Totaal verbruik: {total_consumption:.3f} kWh") + + # Latest transaction + self.cursor.execute(""" + SELECT transaction_id, start_timestamp, stop_timestamp, total_kWh + FROM transactions + ORDER BY stop_timestamp DESC + LIMIT 1 + """) + latest = self.cursor.fetchone() + if latest: + print(f"\nLaatste transactie:") + print(f" ID: {latest[0]}") + print(f" Periode: {latest[1]} - {latest[2]}") + print(f" Verbruik: {latest[3]:.3f} kWh") + + +def main(): + if len(sys.argv) < 2: + print("Gebruik: python3 import_to_existing_db.py ") + print("\nVoorbeeld: python3 import_to_existing_db.py VAN_01971_Transactions.csv") + sys.exit(1) + + csv_file = sys.argv[1] + + print("=" * 60) + print("Charging Station Data Importer") + print("Import naar bestaande 'transactions' tabel") + print("=" * 60) + + # Create importer instance + importer = ChargingDataImporter(DB_CONFIG) + + try: + # Connect to database + importer.connect() + + # Import the file + importer.import_file(csv_file) + + finally: + # Close connection + importer.close() + print("\n✓ Database verbinding gesloten") + + +if __name__ == "__main__": + main() \ No newline at end of file