From c188c00b43cebdbb0ba350ca6f99b5bc268707f2 Mon Sep 17 00:00:00 2001 From: Juul Date: Tue, 15 Jul 2025 23:37:54 +0200 Subject: [PATCH] initial commit --- .gitignore | 2 ++ Telegram.py | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ TelegramData.py | 41 +++++++++++++++++++++ hello.py | 2 ++ ioUtil.py | 17 +++++++++ main.py | 4 +++ 6 files changed, 161 insertions(+) create mode 100644 .gitignore create mode 100644 Telegram.py create mode 100644 TelegramData.py create mode 100644 hello.py create mode 100644 ioUtil.py create mode 100644 main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..df87ee5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv/* +.idea/* \ No newline at end of file diff --git a/Telegram.py b/Telegram.py new file mode 100644 index 0000000..d69d0ca --- /dev/null +++ b/Telegram.py @@ -0,0 +1,95 @@ +import binascii +import datetime + +from TelegramData import TelegramData + + +class Telegram: + type = '/CTA5ZIV-METER' + firmwareVersie = 50 + meterId = 4530303737303030373330383837373232 + totaalVerbruikTarief1 = '015234.018*kWh' + totaalVerbruikTarief2 = '003510.128*kWh' + totaalTerugleveringTarief1 = '001996.135*kWh' + totaalTerugleveringTarief2 = '004945.369*kWh' + tariefIndicator = '0002' + actueelVerbruik = '20.000*kW' + actueleTeruglevering = '03.505*kW' + statuscode2 = '00009' + statuscode1 = '00003' + onderbrekingslog = '1)(0-0:96.7.19)(240624104032S)(0000000215*s' + tellerElektriciteitsMeterstand1 = '00000' + tellerElektriciteitsMeterstand2 = '00000' + tellerElektriciteitsMeterstand3 = '00000' + spanningsOnderbrekingenFase1 = '00005' + spanningsOnderbrekingenFase2 = '00002' + spanningsOnderbrekingenFase3 = '00003' + bepaaldeEvents = '' + spanningFase1 = '241.0*V' + spanningFase2 = '243.0*V' + spanningFase3 = '246.0*V' + stroomFase1 = '030*A' + stroomFase2 = '030*A' + stroomFase3 = '030*A' + vermogenFase1 = '00.000kW' + vermogenFase2 = '00.000kW' + vermogenFase3 = '00.000kW' + terugleveringFase1 = '01.090*kW' + terugleveringFase2 = '01.201*kW' + terugleveringFase3 = '01.213*kW' + gasmeterTelegram = '003' + gasmeterId = '4730303732303034323030333530343232' + gasverbruik = '250528172000S)(02334.011*m3' + + def getDatumTijd(self): + return datetime.datetime.now().strftime('%y%m%d%H%M%SS') # TODO: change 'S' to actual season + + def berekenCrc(self, telegram): + bericht = b''.join(telegram) + crc = binascii.crc_hqx(telegram, 0x0000) + return f'!{crc:04X}\r\n' + + def maakTelegram(self): + return [ + f'{TelegramData.P1_KENMERK}\r\n'.encode(), + f'\r\n'.encode(), + f'{TelegramData.FIRMWARE_VERSIE}(50)\r\n'.encode(), + f'{TelegramData.DATUM_TIJD}({self.getDatumTijd()})\r\n'.encode(), + f'{TelegramData.METER_ID}({self.meterId})\r\n'.encode(), + f'{TelegramData.TOTAAL_VERBRUIK_TARIEF1}({self.totaalVerbruikTarief1})\r\n'.encode(), + f'{TelegramData.TOTAAL_VERBRUIK_TARIEF2}({self.totaalVerbruikTarief2})\r\n'.encode(), + f'{TelegramData.TOTAAL_TERUGLEVERING_TARIEF1}({self.totaalTerugleveringTarief1})\r\n'.encode(), + f'{TelegramData.TOTAAL_TERUGLEVERING_TARIEF2}({self.totaalTerugleveringTarief2})\r\n'.encode(), + f'{TelegramData.TARIEF_INDICATOR}({self.tariefIndicator})\r\n'.encode(), + f'{TelegramData.ACTUEEL_VERBRUIK}({self.actueelVerbruik})\r\n'.encode(), + f'{TelegramData.ACTUEELE_TERUGLEVERING}({self.actueleTeruglevering})\r\n'.encode(), + f'{TelegramData.STATUSCODE2}({self.statuscode2})\r\n'.encode(), + f'{TelegramData.STATUSCODE1}({self.statuscode1})\r\n'.encode(), + f'{TelegramData.ONDERBREKINGSLOG}({self.onderbrekingslog})\r\n'.encode(), + f'{TelegramData.TELLER_ELEKTRICITEITSMETERSTAND1}({self.tellerElektriciteitsMeterstand1})\r\n'.encode(), + f'{TelegramData.TELLER_ELEKTRICITEITSMETERSTAND2}({self.tellerElektriciteitsMeterstand2})\r\n'.encode(), + f'{TelegramData.TELLER_ELEKTRICITEITSMETERSTAND3}({self.tellerElektriciteitsMeterstand3})\r\n'.encode(), + f'{TelegramData.SPANNINGSONDERBREKINGEN_fASE1}({self.spanningsOnderbrekingenFase1})\r\n'.encode(), + f'{TelegramData.SPANNINGSONDERBREKINGEN_fASE2}({self.spanningsOnderbrekingenFase2})\r\n'.encode(), + f'{TelegramData.SPANNINGSONDERBREKINGEN_fASE3}({self.spanningsOnderbrekingenFase3})\r\n'.encode(), + f'{TelegramData.BEPAALDE_EVENTS}({self.bepaaldeEvents})\r\n'.encode(), + f'{TelegramData.SPANNING_FASE1}({self.spanningFase1})\r\n'.encode(), + f'{TelegramData.SPANNING_FASE2}({self.spanningFase2})\r\n'.encode(), + f'{TelegramData.SPANNING_FASE3}({self.spanningFase3})\r\n'.encode(), + f'{TelegramData.STROOM_FASE1}({self.stroomFase1})\r\n'.encode(), + f'{TelegramData.STROOM_FASE2}({self.stroomFase2})\r\n'.encode(), + f'{TelegramData.STROOM_FASE3}({self.stroomFase3})\r\n'.encode(), + f'{TelegramData.VERMOGEN_FASE_1}({self.vermogenFase1})\r\n'.encode(), + f'{TelegramData.VERMOGEN_FASE_2}({self.vermogenFase2})\r\n'.encode(), + f'{TelegramData.VERMOGEN_FASE_3}({self.vermogenFase3})\r\n'.encode(), + f'{TelegramData.TERUGLEVERING_FASE1}({self.terugleveringFase1})\r\n'.encode(), + f'{TelegramData.TERUGLEVERING_FASE2}({self.terugleveringFase2})\r\n'.encode(), + f'{TelegramData.TERUGLEVERING_FASE3}({self.terugleveringFase3})\r\n'.encode(), + f'{TelegramData.GASMETER_TELEGRAM}({self.gasmeterTelegram})\r\n'.encode(), + f'{TelegramData.GASMETER_ID}({self.gasmeterId})\r\n'.encode(), + f'{TelegramData.GASVERBRUIK}({self.gasverbruik})\r\n'.encode(), + ] + + def __str__(self): + telegram = self.maakTelegram() + return telegram.append(self.berekenCrc(telegram)) diff --git a/TelegramData.py b/TelegramData.py new file mode 100644 index 0000000..de1b5ea --- /dev/null +++ b/TelegramData.py @@ -0,0 +1,41 @@ +from enum import Enum + +class TelegramData(Enum): + P1_KENMERK = "/CTA5ZIV-METER" + FIRMWARE_VERSIE = "1-3:0.2.8" + DATUM_TIJD = "0-0:1.0.0" + METER_ID = "0-0:96.1.1" + TOTAAL_VERBRUIK_TARIEF1 = "1-0:1.8.1" + TOTAAL_VERBRUIK_TARIEF2 = "1-0:1.8.2" + TOTAAL_TERUGLEVERING_TARIEF1 = "1-0:2.8.1" + TOTAAL_TERUGLEVERING_TARIEF2 = "1-0:2.8.2" + TARIEF_INDICATOR = "0-0:96.14.0" + ACTUEEL_VERBRUIK = "1-0:1.7.0" + ACTUEELE_TERUGLEVERING = "1-0:2.7.0" + STATUSCODE2 = "0-0:96.7.21" + STATUSCODE1 = "0-0:96.7.9" + ONDERBREKINGSLOG = "1-0:99.97.0" + TELLER_ELEKTRICITEITSMETERSTAND1 = "1-0:32.32.0" + TELLER_ELEKTRICITEITSMETERSTAND2 = "1-0:52.32.0" + TELLER_ELEKTRICITEITSMETERSTAND3 = "1-0:72.32.0" + SPANNINGSONDERBREKINGEN_fASE1 = "1-0:32.36.0" + SPANNINGSONDERBREKINGEN_fASE2 = "1-0:52.36.0" + SPANNINGSONDERBREKINGEN_fASE3 = "1-0:72.36.0" + BEPAALDE_EVENTS = "0-0:96.13.0" + SPANNING_FASE1 = "1-0:32.7.0" + SPANNING_FASE2 = "1-0:52.7.0" + SPANNING_FASE3 = "1-0:72.7.0" + STROOM_FASE1 = "1-0:31.7.0" + STROOM_FASE2 = "1-0:51.7.0" + STROOM_FASE3 = "1-0:71.7.0" + VERMOGEN_FASE_1 = "1-0:21.7.0" + VERMOGEN_FASE_2 = "1-0:41.7.0" + VERMOGEN_FASE_3 = "1-0:61.7.0" + TERUGLEVERING_FASE1 = "1-0:22.7.0" + TERUGLEVERING_FASE2 = "1-0:42.7.0" + TERUGLEVERING_FASE3 = "1-0:62.7.0" + GASMETER_TELEGRAM = "0-2:24.1.0" + GASMETER_ID = "0-2:96.1.0" + GASVERBRUIK = "0-2:24.2.1" + + diff --git a/hello.py b/hello.py new file mode 100644 index 0000000..cd6c71e --- /dev/null +++ b/hello.py @@ -0,0 +1,2 @@ +def helloWorld(): + return 'Hello, juul!' \ No newline at end of file diff --git a/ioUtil.py b/ioUtil.py new file mode 100644 index 0000000..4fc30c7 --- /dev/null +++ b/ioUtil.py @@ -0,0 +1,17 @@ +from time import sleep + +import serial + +INPUT_PORT = '/dev/ttyUSB0' +OUTPUT_PORT = '/dev/ttyUSB0' + +dataInput = serial.Serial(INPUT_PORT, 115200, timeout=1) +dataOutput = serial.Serial(OUTPUT_PORT, 115200, timeout=1) + + +def verzend(telegram): + while True: + for line in telegram: + print(line) + dataOutput.write(line) + sleep(1) diff --git a/main.py b/main.py new file mode 100644 index 0000000..bb5a1de --- /dev/null +++ b/main.py @@ -0,0 +1,4 @@ +import hello + +if __name__ == '__main__': + print(hello.helloWorld()) \ No newline at end of file