namespace CommonConsole { using Common.Hardware.WaterMeter.eRegister; using Common.Hardware.WaterMeter.eRegister.Features; using Common.Logic.Extensions.SQL; using System; using System.Xml.Serialization; public class Program { public static void Main() { var serialNumbers = String.Join(", ", new Object[] { 17833444, 18743226, 18752765, 19744225, 18743225, 19793034, 19793035, 20731121, 20731265, 18743224 }); var xml = new SQLConnection("Server=SLASQL01.emea.sensus.net; Database=Auftrag; User ID=sa; Password=sqlserver;") .CreateCommand($@" SELECT CAST((SELECT vm.Wert AS CSD , SUBSTRING(ISNULL(fs.Wert, ''), 1, 1) AS RadioKeyType , aps.SerienNr , aps.StatusFertigung , CAST(CASE WHEN vm.Wert LIKE 'CSD 769400%' OR vm.Wert LIKE 'CSD 770951%' OR vm.Wert LIKE 'CSD 772721%' THEN RIGHT(er.Adresse, 9) ELSE aps.SerienNr END AS NVARCHAR(10)) AS MeterId , er.TempAdresse , er.Adresse , x.FertigungsauftragNr , x.Frequency , x.Metersize , x.Volume_per_Pulse AS VolumePerPulse , x.Volume_per_LED_Pulse AS VolumePerLedPulse , CAST(0 AS TINYINT) AS OffsetFactor , CAST(5 AS TINYINT) AS OffsetTime , CAST(0 AS TINYINT) AS FactoryCalibration , CAST(3 AS TINYINT) AS TransmissionInterval , CAST(7 AS TINYINT) AS MBusStatus , CAST(0 AS TINYINT) AS LatWindows , x.Byte11 AS UnitOfMesure , x.Bit56 AS DecimalPoint , x.Disallow_Reverse_Volume AS CandI , x.Alarm_Low_Battery , x.Alarm_Leakage , x.Alarm_Magnetic_Tamper , x.Alarm_Metrology_Unavailable , x.Alarm_Backflow , x.Alarm_Broken_Pipe , x.Alarm_Medium_Absent , x.Alarm_Specific_Error , x.LeakagePeriod , x.LeakageThreshold , x.BrokenPipePeriod , x.BrokenPipeThreshold , x.History_Error_Limits_Days , x.Data_Logging_Period , x.Data_Logging_Forward_Counter , x.Data_Logging_Time_Of_Minimum_Flow , x.Data_Logging_Minimum_Flow , x.Data_Logging_Time_Of_Broken_Pipe , x.Data_Logging_Broken_Pipe_Flow , x.Data_Logging_Current_Flow , x.Data_Logging_Time_Of_Peak_Flow , x.Data_Logging_Peak_Flow , x.Data_Logging_Time_Of_Maximum_Flow , x.Data_Logging_Maximum_Flow , x.Data_Logging_Backward_Volume , x.Data_Logging_Counter , x.Data_Logging_Alarm_State , x.FDR_Day_Of_Data_Reading , x.FDR_Forward_Counter , x.FDR_Time_Of_Minimum_Flow , x.FDR_Minimum_Flow , x.FDR_Time_Of_Broken_Pipe , x.FDR_Broken_Pipe_Flow , x.FDR_Current_Flow , x.FDR_Time_Of_Peak_Flow , x.FDR_Peak_Flow , x.FDR_Time_Of_Maximum_Flow , x.FDR_Maximum_Flow , x.FDR_Backward_Volume , x.FDR_Counter , x.FDR_Alarm_State , x.Transmission_Intervall , x.PowerLevelHex , CAST(CASE WHEN vm.Wert LIKE 'CSD 769400%' OR vm.Wert LIKE 'CSD 770951%' OR vm.Wert LIKE 'CSD 773102%' THEN 0 ELSE 1 END AS BIT) AS DisableOTA , CAST(CASE WHEN vm.Wert LIKE 'CSD 764144%' OR vm.Wert LIKE 'CSD 760407%' THEN 0 ELSE x.LAT_Interval END AS TINYINT) AS LATInterval , CAST(CASE WHEN vm.Wert LIKE 'CSD 769400%' THEN 0 WHEN x.Metersize BETWEEN 53 AND 55 THEN 8 ELSE 10 END AS TINYINT) AS ActivationByThreshold , CAST(CASE WHEN vm.Wert LIKE 'CSD 760407%' OR vm.Wert LIKE 'CSD 764144%' THEN 16 WHEN vm.Wert LIKE 'CSD 38102_BU%' THEN 30 WHEN vm.Wert LIKE 'CSD 772100_WE%' THEN 15 * 60 ELSE 60 * 60 END AS SMALLINT) AS OpenMeteringTransmissionIntervalSeconds , x.UTC_Offset AS UtcOffset , x.Wake_Up_Interval AS WakeUpInterval , CASE WHEN idn.Nennweite < 150 THEN 500 ELSE 50 END AS DisplayVolume , CAST(CASE WHEN er.GeschlossenDatum IS NULL THEN 0 ELSE 1 END AS BIT) AS Sealed FROM eRegister AS er JOIN (SELECT DISTINCT AuftragNr , PositionNr , SerienNr , MAX(StatusFertigung) OVER (PARTITION BY SerienNr) AS StatusFertigung FROM AuftragPositionSerienNr WHERE SerienNr IN ({serialNumbers})) AS aps ON er.Seriennummer = aps.SerienNr JOIN AlleAuftragPositionen AS aap ON aps.AuftragNr = aap.AuftragNr AND aps.PositionNr = aap.PositionNr JOIN (SELECT ap.FertigungsauftragNr , rf.Frequency , ms.Metersize , ms.Volume_per_Pulse , ms.Volume_per_LED_Pulse , u.Byte11 , dp.Bit56 , ap.Disallow_Reverse_Volume , ap.Alarm_Low_Battery , ap.Alarm_Leakage , ap.Alarm_Magnetic_Tamper , ap.Alarm_Metrology_Unavailable , ap.Alarm_Backflow , ap.Alarm_Broken_Pipe , ap.Alarm_Medium_Absent , ap.Alarm_Specific_Error , lp.[Bit0-2] AS LeakagePeriod , lt.[Bit3-7] AS LeakageThreshold , bpp.[Bit0-2] AS BrokenPipePeriod , bpt.[Bit3-7] AS BrokenPipeThreshold , ap.History_Error_Limits_Days , dl.Data_Logging_Period , ap.Data_Logging_Forward_Counter , ap.Data_Logging_Time_Of_Minimum_Flow , ap.Data_Logging_Minimum_Flow , ap.Data_Logging_Time_Of_Broken_Pipe , ap.Data_Logging_Broken_Pipe_Flow , ap.Data_Logging_Current_Flow , ap.Data_Logging_Time_Of_Peak_Flow , ap.Data_Logging_Peak_Flow , ap.Data_Logging_Time_Of_Maximum_Flow , ap.Data_Logging_Maximum_Flow , ap.Data_Logging_Backward_Volume , ap.Data_Logging_Counter , ap.Data_Logging_Alarm_State , ap.FDR_Day_Of_Data_Reading , ap.FDR_Forward_Counter , ap.FDR_Time_Of_Minimum_Flow , ap.FDR_Minimum_Flow , ap.FDR_Time_Of_Broken_Pipe , ap.FDR_Broken_Pipe_Flow , ap.FDR_Current_Flow , ap.FDR_Time_Of_Peak_Flow , ap.FDR_Peak_Flow , ap.FDR_Time_Of_Maximum_Flow , ap.FDR_Maximum_Flow , ap.FDR_Backward_Volume , ap.FDR_Counter , ap.FDR_Alarm_State , ap.Transmission_Intervall , ap.LAT_Interval , utc.UTC_Offset , wup.Wake_Up_Interval , rfpl.PowerLevelHex FROM eRegister_Auftragposition AS ap LEFT JOIN eRegister_Metersize AS ms ON ap.Meter_Size_Id = ms.Id LEFT JOIN eRegister_Radiofrequency AS rf ON ap.Radiofrequency_Id = rf.Id LEFT JOIN eRegister_Unit AS u ON ap.Unit_Id = u.Id LEFT JOIN eRegister_DecimalPoint AS dp ON ap.Decimal_Point_Id = dp.Id LEFT JOIN eRegister_LeakagePeriod AS lp ON ap.Leakage_Period_Id = lp.Id LEFT JOIN eRegister_LeakageThreshold AS lt ON ap.Leakage_Threshold_Id = lt.Id LEFT JOIN eRegister_BrokenPipePeriod AS bpp ON ap.Broken_Pipe_Period_Id = bpp.Id LEFT JOIN eRegister_BrokenPipeThreshold AS bpt ON ap.Broken_Pipe_Threshold_Id = bpt.Id LEFT JOIN eRegister_DataLoggingPeriod AS dl ON ap.Data_Logging_Period_Id = dl.Id LEFT JOIN eRegister_UtcOffset AS utc ON ap.UTC_Offset_Id = utc.Id LEFT JOIN eRegister_WakeUpInterval AS wup ON ap.Wake_Up_Interval_Id = wup.Id LEFT JOIN eRegister_RFPowerlevel AS rfpl ON rf.Frequency = rfpl.Frequenz AND ms.Nennweite = rfpl.Nennweite) AS x ON aap.FertigungsauftragNr = x.FertigungsauftragNr JOIN Identnr AS idn ON aap.IdentNr = idn.IdentNr LEFT JOIN VAKO_Merkmale AS vm ON SUBSTRING(idn.VakoCode, 1, LEN(vm.Basis)) = vm.Basis AND SUBSTRING(idn.VakoCode, vm.Stelle, vm.Laenge) = vm.Charcode AND vm.Wert LIKE 'CSD%' LEFT JOIN VAKO_Merkmale AS fs ON SUBSTRING(idn.VakoCode, 1, LEN(fs.Basis)) = fs.Basis AND SUBSTRING(idn.VakoCode, fs.Stelle, fs.Laenge) = fs.Charcode AND fs.Bezeichnung LIKE 'Funkschlüssel' FOR XML PATH('eProgrammingParameters') , ROOT('eProgramingParametersList')) AS XML)") .FirstOrDefault(x => x.GetXml(0)); var serializer = new XmlSerializer(typeof(eProgramingParametersList)); var model = serializer.Deserialize(xml); if (model is Eregister eregister) { foreach (var pam in eregister.BuildPams()) { Console.WriteLine($"{pam.PamNames}: {BitConverter.ToString(pam.CommandBytes.ToArray())}"); Console.WriteLine(); } } } private static Eregister EregisterModel() => new Eregister { ChangeWakeUp = new ChangeWakeUp { WakeUpMode = WakeUpMode.StayAwake }, ChangeMeterReading = new ChangeMeterReading { DisplayVolume = 500 }, ChangeCustomerText = new ChangeCustomerText { Text = "242300147" }, DeactivateAlarms = new DeactivateAlarms { Backflow = true, MagneticTamper = true, SpecificError = true, }, ResetAlarms = new ResetAlarms { Value = byte.MaxValue }, ParameterizeLeakageDetection = new ParameterizeLeakageDetection { Value = 10, }, ParameterizeBrokenPipeDetection = new ParameterizeBrokenPipeDetection { Value = 50 }, SetHistoricalErrorLimit = new SetHistoricalErrorLimit { Value = 50 }, ChangeDataLoggerSettings = new ChangeDataLoggerSettings { MinimumFlow = 10, TimeInterval = 1440, TimeOfMinimumFlow = 1 }, WirelessMBusMode = new WirelessMBusMode { WMBusEnabled = true, InstallationModeEnabled = true, EncryptionEnabled = true, }, SetPowerLevelSensusRF = new SetPowerLevel { Mode = PowerLevelModes.SensusRF, PowerLevel = 10 }, SetPowerLevelFlexNet = new SetPowerLevel { Mode = PowerLevelModes.FlexNet, PowerLevel = 10 }, Debug = new EregisterDebug { DisableOTAFirmwareUpdate = new DisableOTAFirmwareUpdate { Mode = OTAMode.DisableFWUpdate }, SetActivationByThreshold = new SetActivationByThreshold { Rotations = 1 } }, OpenMeteringTransmitionIntervalWMBus = new OpenMeteringTransmitionIntervalWMBus { Seconds = 15 }, ChangeNumberOfLatWindows = new ChangeNumberOfLatWindows { N = 3 } }; } }