Files
opt/dsmr/dump.py
2024-11-27 10:16:41 +01:00

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))