first commit
This commit is contained in:
135
README.md
Normal file
135
README.md
Normal file
@@ -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!
|
||||
353
VAN_01971_Transactions.csv
Normal file
353
VAN_01971_Transactions.csv
Normal file
@@ -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
|
||||
|
259
import_to_alfendb.py
Normal file
259
import_to_alfendb.py
Normal file
@@ -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 <csv_bestand>")
|
||||
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()
|
||||
Reference in New Issue
Block a user