[Python] csv lezen en mappen naar vaste velden

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Proc
  • Registratie: December 2002
  • Laatst online: 00:32

Proc

Grand Admiral

Topicstarter
Mijn vraag
Ik probeer een reeks (wisselende) waarden uit een solar omvormer te lezen met behulp van Python.
Deze waarden lees ik af van een webpage met behulp van een Python script, en deze waarden komen overeen met een set vaste velden (dus de inhoud van de velden wisselt weliswaar, maar de volgorde van de velden blijft hetzelfde).

Wat ik graag wil bereiken is dat ik de wisselende waarden koppel aan globale (integer) variabelen waar ik verder mee kan werken. Mijn uiteindelijke doel is om deze waarden terug te koppelen aan Domoticz en in Domoticz af te lezen hoeveel de PV installatie produceert zonder afhankelijk te zijn van externe monitoringportals. De variabelen in de exacte volgorde waarin de waarden worden aangeleverd zijn als volgt;

Statistics
Total_Generated
Total_Running Time
Today_Generated
Today_Running Time
PV1_Voltage
PV1_Current
PV2_Voltage
PV2_Current
PV3_Voltage
PV3_Current
PV1_StrCurr1
PV1_StrCurr2
PV1_StrCurr3
PV1_StrCurr4
PV2_StrCurr1
PV2_StrCurr2
PV2_StrCurr3
PV2_StrCurr4
PV3_StrCurr1
PV3_StrCurr2
PV3_StrCurr3
PV3_StrCurr4
Grid-connected_Power
Grid-connected_Frequency
Line1_Voltage
Line1_Current
Line2_Voltage
Line2_Current
Line3_Voltage
Line3_Current
Bus_Voltage
Device_Temperature
CO2emission_Reduction
Other_Status

Een voorbeeld van hoe de waarden worden aangeleverd is als volgt;
['1', '4378', '998', '668', '69', '1842', '328', '1226', '336', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '65535', '992', '4999', '2364', '421', '65535', '65535', '65535', '65535', '3663', '348', '343', '2']

Relevante software en hardware die ik gebruik
De omgeving waarin het werkt is een Python 2.7 omgeving op een Raspbian (gebaseerd op Debian 9.1) omgeving en het draait op een RaspberryPi 3. (de RPi heeft het IP adres 192.168.1.4 die je in het script tegenkomt).

Wat ik al gevonden of geprobeerd heb
Ik ben vooralsnog zover gekomen, maar jammer genoeg weet ik niet hoe ik hier verder moet.

#!/usr/bin/python
# This script reads the output of SAJ Solar Inverters and parses it so that it can be used in a meaningful way
# Import libraries
import csv
import urllib2
import base64

def main():
global username,password
username = 'gebruikersnaam'
password = 'wachtwoord'

request = urllib2.Request("http://192.168.1.4/status/status.php")
base64string = base64.b64encode('%s:%s' % (username, password))
request.add_header("Authorization", "Basic %s" % base64string)
response = urllib2.urlopen(request)
status = csv.reader(response, delimiter=",")

for row in status:
print(row)

Alle reacties


Acties:
  • +1 Henk 'm!

  • EngineerCoding
  • Registratie: Oktober 2015
  • Laatst online: 31-12-2023
Ik zou met een dictionary gaan werken om de data in te lezen om deze vervolgens in een globale scope te processen.

Als je CSV een header heeft, zou ik DictReader (van de CSV module) gebruiken. Ook als de CSV geen header heeft kan je in de constructor een lijst van fieldnames meegeven. Als je echt Barebones wilt kan je uiteraard ook de zip functie gebruiken, wat de DictReader ook intern gebruikt.

Ik moedig je aan om de documentatie te lezen over bovenstaande klassen en functies.

Acties:
  • 0 Henk 'm!

  • Proc
  • Registratie: December 2002
  • Laatst online: 00:32

Proc

Grand Admiral

Topicstarter
Tnx. Ik ga mij daar eens op inlezen.

Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

Maar als je de waarden van http://192.168.1.4/status/status.php trekt dan kun je die (of een anndere) pagina toch ook gewoon gelijk de relevante data latten loggen in een db met een cronjob? PHP praat native met SQLite dus wellicht kunt je zelfs rechtstreeks data in domoticz.db dumpen? Just a thought...

[ Voor 5% gewijzigd door Harrie_ op 06-11-2017 22:06 ]

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 22:59
Je zou de namen en waardes met zip kunnen combineren tot een dictionairy (key - value):

Python:
1
2
3
4
5
6
7
8
9
10
11
# Namen en waardes
names = ['a', 'b', 'c']
values = [1, 2, 3]

# Zippen
zipped = zip(names, values)

# Conversie naar dictionairy
data = dict(zipped)

# Resultaat: {"a": 1, "b": 2, "c": 3}


Maar CSV DictReader is inderdaad handiger. De oplossing met zip zou ik alleen gebruiken als de CSV geen header met veldnamen heeft. Die veldnamen moet je dan in je code opgeven, wat niet super flexibel is (want als de indeling van de CSV veranderd moet je code ook aangepast worden).

[ Voor 39% gewijzigd door Morrar op 06-11-2017 22:21 ]