Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
snippet to write solaredge optimisers panel data in an influxdb database
import requests, pickle
from datetime import datetime
import json, pytz
import pandas as pd
from influxdb import DataFrameClient
login_url = "https://monitoring.solaredge.com/solaredge-apigw/api/login"
panels_url = "https://monitoring.solaredge.com/solaredge-web/p/playbackData"
SOLAREDGE_USER = "" # web username
SOLAREDGE_PASS = "" # web password
SOLAREDGE_SITE_ID = "" # site id
DAILY_DATA = "4"
WEEKLY_DATA = "5"
INFLUXDB_IP = ""
INFLUXDB_PORT = 8086
INFLUXDB_DATABASE = ""
INFLUXDB_SERIES = "optimisers"
INFLUXDB_RETENTION_POLICY = "autogen"
session = requests.session()
with open('solaredge.cookies', 'rb') as f:
session.cookies.update(pickle.load(f))
panels = session.post(panels_url, headers = {"Content-Type": "application/x-www-form-urlencoded", "X-CSRF-TOKEN": session.cookies["CSRF-TOKEN"]}, data={"fieldId": SOLAREDGE_SITE_ID, "timeUnit": DAILY_DATA})
if panels.status_code != 200:
session.post(login_url, headers = {"Content-Type": "application/x-www-form-urlencoded"}, data={"j_username": SOLAREDGE_USER, "j_password": SOLAREDGE_PASS})
panels = session.post(panels_url, headers = {"Content-Type": "application/x-www-form-urlencoded", "X-CSRF-TOKEN": session.cookies["CSRF-TOKEN"]}, data={"fieldId": SOLAREDGE_SITE_ID, "timeUnit": DAILY_DATA})
if panels.status_code != 200:
return
with open('solaredge.cookies', 'wb') as f:
pickle.dump(s.cookies, f)
response = panels.content.decode("utf-8").replace('\'', '"').replace('Array', '').replace('key', '"key"').replace('value', '"value"')
response = response.replace('timeUnit', '"timeUnit"').replace('fieldData', '"fieldData"').replace('reportersData', '"reportersData"')
response = json.loads(response)
data = {}
for date_str in response["reportersData"].keys():
date = datetime.strptime(date_str, '%a %b %d %H:%M:%S GMT %Y')
date = pytz.timezone('Australia/Adelaide').localize(date).astimezone(pytz.utc)
for sid in response["reportersData"][date_str].keys():
for entry in response["reportersData"][date_str][sid]:
if entry["key"] not in data.keys():
data[entry["key"]] = {}
data[entry["key"]][date] = float(entry["value"].replace(",", ""))
df = pd.DataFrame(data)
conn = DataFrameClient(INFLUXDB_IP, INFLUXDB_PORT, "", "", INFLUXDB_DATABASE)
conn.write_points(df, INFLUXDB_SERIES, retention_policy=INFLUXDB_RETENTION_POLICY)
@dragoshenron

This comment has been minimized.

Copy link

@dragoshenron dragoshenron commented Feb 19, 2020

Hi.
Create an empty solaredge.cookies raises "EOFError: Ran out of input" (Pickle can't read an empty file).
Populate randomly the solaredge.cookies file raises underflow error.
Any suggestion?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment