110 lines
3.7 KiB
Python
110 lines
3.7 KiB
Python
import requests
|
|
import json
|
|
import django
|
|
|
|
from datetime import datetime
|
|
from django.dispatch import receiver
|
|
|
|
|
|
from django.dispatch import receiver
|
|
from django.core import serializers
|
|
from django.utils import timezone
|
|
|
|
|
|
from dsmr_datalogger.models.reading import DsmrReading
|
|
from dsmr_pvoutput.models.settings import PVOutputAddStatusSettings
|
|
from dsmr_pvoutput.signals import pvoutput_upload
|
|
|
|
|
|
@receiver(django.db.models.signals.post_save, sender=DsmrReading)
|
|
def handle_dsmr_reading(sender, instance, created, raw, **kwargs):
|
|
if not created or raw:
|
|
return
|
|
|
|
instance.timestamp = timezone.localtime(instance.timestamp)
|
|
|
|
if instance.extra_device_timestamp:
|
|
instance.extra_device_timestamp = timezone.localtime(instance.extra_device_timestamp)
|
|
|
|
serialized = json.loads(serializers.serialize('json', [instance]))
|
|
# {
|
|
# "timestamp": "2022-07-19T14:11:07.215912",
|
|
# "serialized": [
|
|
# {
|
|
# "model": "dsmr_datalogger.dsmrreading",
|
|
# "pk": 2577432,
|
|
# "fields": {
|
|
# "processed": false,
|
|
# "timestamp": "2022-07-19T14:11:11+02:00",
|
|
# "electricity_delivered_1": "5689.229",
|
|
# "electricity_returned_1": "366.707",
|
|
# "electricity_delivered_2": "5664.327",
|
|
# "electricity_returned_2": "688.836",
|
|
# "electricity_currently_delivered": "0.000",
|
|
# "electricity_currently_returned": "0.360",
|
|
# "phase_currently_delivered_l1": "0.000",
|
|
# "phase_currently_delivered_l2": null,
|
|
# "phase_currently_delivered_l3": null,
|
|
# "extra_device_timestamp": "2022-07-19T14:00:00+02:00",
|
|
# "extra_device_delivered": "3500.427",
|
|
# "phase_currently_returned_l1": "0.360",
|
|
# "phase_currently_returned_l2": null,
|
|
# "phase_currently_returned_l3": null,
|
|
# "phase_voltage_l1": null,
|
|
# "phase_voltage_l2": null,
|
|
# "phase_voltage_l3": null,
|
|
# "phase_power_current_l1": "2",
|
|
# "phase_power_current_l2": null,
|
|
# "phase_power_current_l3": null
|
|
# }
|
|
# }
|
|
# ]
|
|
# }
|
|
|
|
timestamp = datetime.today().isoformat()
|
|
data = {
|
|
'timestamp': timestamp,
|
|
'model': serialized[0]['model'],
|
|
'pk': serialized[0]['pk'],
|
|
'fields': serialized[0]['fields']
|
|
}
|
|
path = f'/dump/{timestamp}-reading.json'
|
|
json.dump(data, open(path, 'w'))
|
|
|
|
# json_string = json.dumps(serialized[0]['fields'])
|
|
# try:
|
|
# requests.post(
|
|
# 'https://YOUR-DSMR-HOST/api/endpoint/',
|
|
# data=json_string,
|
|
# # A low timeout prevents DSMR-reader from hanging, when the remote server is unreachable.
|
|
# timeout=5
|
|
# )
|
|
# except Exception as error:
|
|
# print('forward_json_dsmrreading_to_api:', error)
|
|
|
|
|
|
@receiver(pvoutput_upload)
|
|
def handle_pvoutput(**kwargs):
|
|
# print(' - Uploading the same data to PVOutput using plugin: {}'.format(kwargs['data']))
|
|
# - Uploading the same data to PVOutput using plugin: {'d': '20220719', 't': '14:15', 'v3': 3817, 'v4': -366, 'n': 1}
|
|
|
|
timestamp = datetime.today().isoformat()
|
|
data = {
|
|
'timestamp': timestamp,
|
|
'data': kwargs['data']
|
|
}
|
|
path = f'/dump/{timestamp}-pvoutput.json'
|
|
json.dump(data, open(path, 'w'))
|
|
|
|
# response = requests.post(
|
|
# PVOutputAddStatusSettings.API_URL,
|
|
# headers={
|
|
# 'X-Pvoutput-Apikey': 'XXXXX',
|
|
# 'X-Pvoutput-SystemId': 'YYYYY',
|
|
# },
|
|
# data=kwargs['data']
|
|
# )
|
|
#
|
|
# if response.status_code != 200:
|
|
# print(' [!] PVOutput upload failed (HTTP {}): {}'.format(response.status_code, response.text))
|