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