initial commit

This commit is contained in:
Juul
2025-07-15 23:37:54 +02:00
commit c188c00b43
6 changed files with 161 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
.venv/*
.idea/*
+95
View File
@@ -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))
+41
View File
@@ -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"
+2
View File
@@ -0,0 +1,2 @@
def helloWorld():
return 'Hello, juul!'
+17
View File
@@ -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)
+4
View File
@@ -0,0 +1,4 @@
import hello
if __name__ == '__main__':
print(hello.helloWorld())