laatzen/Common/CommonConsole/Program.cs
2024-10-17 10:06:36 +02:00

303 lines
14 KiB
C#

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
}
};
}
}