303 lines
14 KiB
C#
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
|
|
}
|
|
};
|
|
}
|
|
} |