common/CommonConsole/Program.cs
2026-04-23 17:50:07 +02:00

487 lines
24 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

namespace CommonConsole
{
using Common.Hardware.SIRT;
using Common.Hardware.SIRT.Tasks;
using Common.Hardware.WaterMeter.eRegister.Features;
using LaaPackages.SqlClient;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Runtime.Serialization;
public static partial class Program
{
static void Main()
{
}
public class Apps : Dictionary<string, App>
{
private readonly Dictionary<int, App> apps = new Dictionary<int, App>();
[OnDeserialized]
private void OnDeserialized(StreamingContext _)
{
foreach (var kvp in this)
{
var app = kvp.Value;
app.Name = kvp.Key;
this.apps[app.Id] = app;
}
}
internal object GetAppName(int appId)
{
if (this.apps.TryGetValue(appId, out var app))
{
return app.Name;
}
return default(object);
}
internal object GetRegName(int appId, int regId)
{
if (this.apps.TryGetValue(appId, out var app))
{
return app.GetRegName(regId);
}
return default(object);
}
}
public class App
{
public int Id { get; set; }
public string Name { get; set; }
public Registers Registers { get; set; } = new Registers();
internal object GetRegName(int regId)
=> this.Registers.GetRegName(regId);
}
public class Registers : Dictionary<string, Register>
{
private readonly Dictionary<int, Register> registers = new Dictionary<int, Register>();
internal object GetRegName(int regId)
{
if (this.registers.TryGetValue(regId, out var reg))
{
return reg.Name;
}
return default(object);
}
[OnDeserialized]
private void OnDeserialized(StreamingContext _)
{
foreach (var kvp in this)
{
var register = kvp.Value;
register.Name = kvp.Key;
this.registers[register.Id] = register;
}
}
}
public class Register
{
public int Id { get; set; }
public string Name { get; set; }
}
static void Main_RegHistory()
{
var json = File.ReadAllText(@"..\..\all.json");
var apps = JsonConvert.DeserializeObject<Apps>(json);
var csv = new List<List<object>>();
csv.Add(new List<object> { "PcbId", "AppId", "AppName", "RegId", "RegName", "Value", "Date" });
SqlConnection
.CreateSqlConnection("Server=DELAZ1SQL01.world.fluidtechnology.net; Database=Auftrag; User ID=sa; Password=sqlserver;")
.CreateCommand(@"
SELECT x.PcbId
, CONVERT(INT, CONVERT(VARBINARY, LEFT(x.Address, 2), 2)) AS App
, CONVERT(INT, CONVERT(VARBINARY, RIGHT(x.Address, 2), 2)) AS Reg
, x.Value
, FORMAT(x.date, 'yyyy-MM-dd HH:mm:ss') AS Date
FROM (SELECT PcbId
, Address
, Value
, date
, ROW_NUMBER() OVER (PARTITION BY Address ORDER BY date DESC) AS RowNr
FROM GenesisMeterRegisterHistory
WHERE PcbId = '254620052'
AND Value <> 'NULL')
AS x
WHERE x.RowNr = 1")
.ExecuteReader(x =>
{
var pcbId = x.GetValue<int>(0);
var appId = x.GetValue<int>(1);
var appName = apps.GetAppName(appId);
var regId = x.GetValue<int>(2);
var regName = apps.GetRegName(appId, regId);
var value = x.GetValue<string>(3);
var date = x.GetValue<string>(4);
csv.Add(new List<object> { pcbId, appId, appName, regId, regName, value, date });
});
File.WriteAllLines(@"..\..\254620052.csv", csv.Select(x => string.Join(";", x)));
}
static void Main_Pwd()
{
//var Url = $"{ServiceUrls.KeyServerCustom()}keysetkeys/";
//var Url = "https://nodes.sms-esaap.com/keygenproxy/api/v3/custom/keysets/devices";
//var header = new Dictionary<String, String>();
//header.Add("Cache-Control", "no-cache");
//header.Add("X-Node-Token", Token);//"d5b8c0b2-81f6-4421-80d0-44eb2093e616");
//string postData = $"[{{\"setId\":\"{KeySetID}\", \"orderNumber\":\"{orderNumber}\", \"radioAdress\":\"{radioAdress}\"}}]";
//var postData = new MapKeySetItem()
//{ orderNumber = MeterOrderNumber.ToString(), radioAdress = MeterPassowrdIdent.ToString(), setId = KeySetID };
//var helpArray = new List<MapKeySetItem>() { postData };
// return LocalWebRequest.PostRequestAsyncAndGetContent(url: Url, header: header, json: helpArray.ToArray(), timeoutMs: 20000);
//using (var httpRequest = new HttpRequestMessage(HttpMethod.Post, "https://nodes.sms-esaap.com/keygenproxy/api/v3/custom/keysets/devices"))
//{
// httpRequest.Headers.Add("Cache-Control", "no-cache");
// httpRequest.Headers.Add("X-Node-Token", "d5b8c0b2-81f6-4421-80d0-44eb2093e616");
// httpRequest.Content = new StringContent(JsonConvert.SerializeObject(units));
// httpRequest.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
// using (var httpResponse = new HttpClient().SendAsync(httpRequest).Result)
// {
// using (var httpContent = httpResponse.Content)
// {
// var content = httpContent.ReadAsStringAsync().Result;
// }
// }
//}
// 43280002E023
// 0ED6EE109B27B7C02E6A351C0F66B155649938996D7B45475F67A568CCBEC34E
// A15088A4B476B3F47A5F14F0D8DCDAE4F42D3279FD9B6D9AC995389251D0AEB6
// 449E0701B6C2
// 0B34274BE517CD86B7A378AD197D3AA0FC2C262C0B09ED4A530FAED7E52615CC
// 42ED98391C30EECA5CC500A3086BD4B0A20ACF387BB41613057FF476D7E4D822
// 8C5FD08CC8D720344243D4059AD34982F2452C5123F42D7E417DB03B3C59D1D8
// E18AFAF87B9301A5FF5F3539752BADA03389F1A1E9470EF99FC64F313351C485
// F87DD657D1A11D1EBD3A8F21779DD2E60B4B8B4F5203A6680A5EBCE72DC7F771
// 528B13015F205316381018A5CD16264266B58BB3F1A1DE09EB88D75132694834
// C0E9DBBD18F1101F8AABC3C48B71996768E8F8C30E91E402A10627D42B8F734B
// 73C8A7C67600F91C66512FBED68610A25BBF2F2A5AFED40CDEA0C33C71F15535
// 4B3DEEBFE79E1594BAF13A743CD252295B0D1C8200BD03C1F904850768FD145B
// A1F4FA7C71A5EAC60257480FF5DCE1FF5B076BF134DD67B13FF11A9309009E90
var units = new List<object>
{
new { orderNumber = 3251029, radioAdress = 10402023451, setId = "8d98dfc7-27ab-4a7b-b3e1-44206fe122c3" }, // 4B3DEEBFE79E
new { orderNumber = 3251029, radioAdress = 10402023470, setId = "2698c112-eb85-4408-a1b4-4bc1e64cbfc3" }, // A1F4FA7C71A5
new { orderNumber = 3251029, radioAdress = 10402023476, setId = "5744f62e-f2d9-47be-8d9f-b25b9801de92" }, // 73C8A7C67600
new { orderNumber = 3251029, radioAdress = 10402023479, setId = "67a66322-c19b-4b18-a24a-ada3e5c7f659" }, // C0E9DBBD18F1
new { orderNumber = 3251029, radioAdress = 10402023480, setId = "438dc338-0c78-42fa-9436-1a9ad21c4e29" }, // 528B13015F20
}.ToArray();
using (var httpRequest = new HttpRequestMessage(HttpMethod.Get, "https://nodes.sms-esaap.com:8081/api/v3/custom/keysetkeys?orderNumber=0&radioAdress=10402023480"))
{
httpRequest.Headers.Add("Cache-Control", "no-cache");
httpRequest.Headers.Add("X-Node-Token", "d5b8c0b2-81f6-4421-80d0-44eb2093e616");
using (var httpResponse = new HttpClient().SendAsync(httpRequest).Result)
{
using (var httpContent = httpResponse.Content)
{
var content = httpContent.ReadAsStringAsync().Result;
Console.WriteLine(JsonConvert.SerializeObject(JsonConvert.DeserializeObject(content), Formatting.Indented));
}
}
}
}
static void Main_SIRT()
{
//var _semiStr = "08F5126B8061000001F40000830C00FF0000000000000009130197DB65070E10A87716DACA00007FFF0004000000000000000000000000000000000000000000000403003C0003013140EF511D00000000000000000000050005300000";
//var semiStr = "083D126B8061000002020000BF0C00FF0000000000000009130197DB65050E10A87716DAC900007FFF015A000000000000000000000000000000000000000000000403003C00030131413F6C1D000000000000000000015B015B300000";
//var semiBytes = semiStr.GetBytes();
//var semi = new SEMI(semiBytes, 868, 0);
//var debugStr = "0B00126B8061000C010B0106050151F5A57213006800202000000000002C543E02010116003002710000827100000000000005A000";
//var debugBytes = debugStr.GetBytes();
//var debug = new DEBUG(debugBytes, 0);
//var logfile = @"..\..\log.txt";
SIRTLogger.Message += Console.WriteLine;
var hub = new SIRTHub();
hub.TryOpen("COM6", out var id1, out var mhz1);
hub.TryOpen("COM7", out var id2, out var mhz2);
var task = new WritePamTask
{
Timeout = 15000,
WakeUpCmd = true,
WakeUpModul = true,
DelPamSemi = true,
Frequency = 868,
ResponseAddress = 309035105,
RequestAddress = 309035105,
EncryptionKeyI = "5DD3EF5233B4DAA6836721F2866182DA".GetBytes(),
Data = new SetMeterType
{
Type = MeterTypes.Residential__0x0B
}
.Append(new ProvidePin(AuthLevel.III))
};
while (task.State != SIRTTaskState.Completed)
{
if (hub.Start(task))
{
task.Wait();
}
}
hub.CloseAll();
}
static void Main__CSD_Config()
{
var alarmMask = 1 << AlarmMask.ALARM_REBOOT
| 1 << AlarmMask.ALARM_LOW_BATTERY
| 0 << AlarmMask.ALARM_VERY_LOW_BATTERY
| 0 << AlarmMask.ALARM_CONFIG_ERROR
| 1 << AlarmMask.ALARM_EMPTY_PIPE
| 0 << AlarmMask.ALARM_MAGNETIC_TAMPER
| 1 << AlarmMask.ALARM_REVERSE_FLOW
| 1 << AlarmMask.ALARM_SUSPECT_LEAK
| 1 << AlarmMask.ALARM_BROKEN_PIPE
| 1 << AlarmMask.ALARM_LOW_PRESSURE
| 1 << AlarmMask.ALARM_HIGH_PRESSURE
| 1 << AlarmMask.ALARM_LOW_TEMPERATURE
| 1 << AlarmMask.ALARM_HIGH_TEMPERATURE
| 0 << AlarmMask.ALARM_RADIO_ERROR
| 0 << AlarmMask.ALARM_METROLOGY_PARAMS
| 0 << AlarmMask.ALARM_METROLOGY_MEASURE
| 0 << AlarmMask.ALARM_MAX;
var alarmBytes = BitConverter.GetBytes(alarmMask);
Array.Reverse(alarmBytes);
Console.WriteLine($"{"VAM:",5} {alarmMask,11} {BitConverter.ToString(alarmBytes).Replace("-", "")}");
uint content = (uint)1 << LogContentBits.AlarmStatus // ALWAYS ON
| (uint)1 << LogContentBits.BillingCounter // ALWAYS ON
| (uint)1 << LogContentBits.ReverseCounter //
| (uint)1 << LogContentBits.MaxFlow //
| (uint)1 << LogContentBits.MaxFlowTime //
| (uint)0 << LogContentBits.PeakFlow //
| (uint)0 << LogContentBits.PeakFlowTime //
| (uint)0 << LogContentBits.AvgFlow //
| (uint)0 << LogContentBits.BrokenPipe //
| (uint)0 << LogContentBits.BrokenPipeTime //
| (uint)1 << LogContentBits.MinFlow //
| (uint)0 << LogContentBits.MinFlowTime //
| (uint)0 << LogContentBits.ForwardCounter //
| (uint)1 << LogContentBits._UTC32 // ALWAYS ON
| (uint)0 << LogContentBits._MaskSelector_1_1 // X
| (uint)0 << LogContentBits._MaskSelector_1_2 // X
| (uint)0 << LogContentBits.MinPress //
| (uint)0 << LogContentBits.MinPressTime //
| (uint)1 << LogContentBits.MaxPress //
| (uint)1 << LogContentBits.MaxPressTime //
| (uint)0 << LogContentBits.MinTemp //
| (uint)0 << LogContentBits.MinTempTime //
| (uint)0 << LogContentBits.MaxTemp //
| (uint)0 << LogContentBits.MaxTempTime //
| (uint)0 << LogContentBits.CurrentPress //
| (uint)0 << LogContentBits.CurrentTemp //
| (uint)1 << LogContentBits.ExtendedAlarm // ALWAYS ON
| (uint)1 << LogContentBits._RecordCheckSum; // ALWAYS ON
var contentBytes = BitConverter.GetBytes(content);
Array.Reverse(contentBytes);
Console.WriteLine($"{"DLG:",5} {content,11} {BitConverter.ToString(contentBytes).Replace("-", "")}");
uint fdr = (uint)1 << LogContentBits.AlarmStatus // ALWAYS ON
| (uint)1 << LogContentBits.BillingCounter // ALWAYS ON
| (uint)1 << LogContentBits.ReverseCounter //
| (uint)0 << LogContentBits.MaxFlow //
| (uint)0 << LogContentBits.MaxFlowTime //
| (uint)0 << LogContentBits.PeakFlow //
| (uint)0 << LogContentBits.PeakFlowTime //
| (uint)0 << LogContentBits.AvgFlow //
| (uint)0 << LogContentBits.BrokenPipe //
| (uint)0 << LogContentBits.BrokenPipeTime //
| (uint)0 << LogContentBits.MinFlow //
| (uint)0 << LogContentBits.MinFlowTime //
| (uint)0 << LogContentBits.ForwardCounter //
| (uint)1 << LogContentBits._UTC32 // ALWAYS ON
| (uint)0 << LogContentBits._MaskSelector_1_1 // X
| (uint)0 << LogContentBits._MaskSelector_1_2 // X
| (uint)0 << LogContentBits.MinPress //
| (uint)0 << LogContentBits.MinPressTime //
| (uint)0 << LogContentBits.MaxPress //
| (uint)0 << LogContentBits.MaxPressTime //
| (uint)0 << LogContentBits.MinTemp //
| (uint)0 << LogContentBits.MinTempTime //
| (uint)0 << LogContentBits.MaxTemp //
| (uint)0 << LogContentBits.MaxTempTime //
| (uint)0 << LogContentBits.CurrentPress //
| (uint)0 << LogContentBits.CurrentTemp //
| (uint)1 << LogContentBits.ExtendedAlarm // ALWAYS ON
| (uint)1 << LogContentBits._RecordCheckSum; // ALWAYS ON
var fdrBytes = BitConverter.GetBytes(fdr);
Array.Reverse(fdrBytes);
Console.WriteLine($"{"FDR:",5} {fdr,11} {BitConverter.ToString(fdrBytes).Replace("-", "")}");
Console.WriteLine();
}
class LogContentBits
{
public const byte AlarmStatus = 0; // 0x00000001 ;The active alarm information at UTC32 
public const byte BillingCounter = 1; // 0x00000002 ;The billing counter at UTC32 
public const byte ReverseCounter = 2; // 0x00000004 ;The reverse counter at UTC32 
public const byte MaxFlow = 3; // 0x00000008 ;The maximum flow of the current FDR period UTC32n … UTC32n1 
public const byte MaxFlowTime = 4; // 0x00000010 ;The Date/Time information when Qmax happened in the FDR period 
public const byte PeakFlow = 5; // 0x00000020 ;The peak flow of the current FDR period 
public const byte PeakFlowTime = 6; // 0x00000040 ;The Date/Time information when Qpeak happened in the FDR period 
public const byte AvgFlow = 7; // 0x00000080 ;The average flow rate in the current FDR period 
public const byte BrokenPipe = 8; // 0x00000100 ;The weak flow in the current FDR period  
public const byte BrokenPipeTime = 9; // 0x00000200 ;The Date/Time information when Qweak happened in the FDR period 
public const byte MinFlow = 10; // 0x00000400 ;The minimum flow in the current FDR period 
public const byte MinFlowTime = 11; // 0x00000800 ;The Date/Time information when Qmin happened in the FDR period 
public const byte ForwardCounter = 12; // 0x00001000 ;The forward counter at UTC32 
public const byte _UTC32 = 13; // 0x00002000 ;Date/Time information when the record was stored. 
public const byte _MaskSelector_1_1 = 14; // 0x00004000 ;Two selector bits to switch the bitmask of the RFcommunication between the internal pages 
public const byte _MaskSelector_1_2 = 15; // 0x00008000 ;Two selector bits to switch the bitmask of the RFcommunication between the internal pages
public const byte MinPress = 16; // 0x00010000 ;The minimum pressure in the current LOG period 
public const byte MinPressTime = 17; // 0x00020000 ;The number of 1second intervals when Pmin happened in the LOG period 
public const byte MaxPress = 18; // 0x00040000 ;The maximum pressure in the current LOG period 
public const byte MaxPressTime = 19; // 0x00080000 ;The number of 1second intervals when Pmax happened in the LOG period 
public const byte MinTemp = 20; // 0x00100000 ;The minimum temperature in the current LOG period 
public const byte MinTempTime = 21; // 0x00200000 ;The number of 1second intervals when Tmin happened in the LOG period 
public const byte MaxTemp = 22; // 0x00400000 ;The maximum temperature in the current LOG period 
public const byte MaxTempTime = 23; // 0x00800000 ;The number of 1second intervals when Tmax happened in the LOG period 
public const byte CurrentPress = 24; // 0x01000000 ;The last measured instantaneous pressure at RTC32 
public const byte CurrentTemp = 25; // 0x02000000 ;The last measured instantaneous temperature at RTC32  
public const byte ExtendedAlarm = 26; // 0x04000000 ;Similar to the AlarmStatus; P and T related Alarms. 
public const byte _RecordCheckSum = 27; // 0x08000000 ;A Checksum across the entire record 
public const byte _Reserved_1 = 28; // 0x10000000 ;A reserved mask for a further item 
public const byte _Reserved_2 = 29; // 0x20000000 ;A reserved mask for a further item 
public const byte _MaskSelector_2_1 = 30; // 0x40000000 ;The mirror of the MaskSelector_1 
public const byte _MaskSelector_2_2 = 31; // 0x80000000 ;The mirror of the MaskSelector_2 
public static string[] BitMask = new string[]
{
"AlarmStatus",
"BillingCounter",
"ReverseCounter",
"MaxFlow",
"MaxFlowTime",
"PeakFlow",
"PeakFlowTime",
"AvgFlow",
"BrokenPipe",
"BrokenPipeTime",
"MinFlow",
"MinFlowTime",
"ForwardCounter",
"_UTC32",
"_MaskSelector_1_1",
"_MaskSelector_1_2",
"MinPress",
"MinPressTime",
"MaxPress",
"MaxPressTime",
"MinTemp",
"MinTempTime",
"MaxTemp",
"MaxTempTime",
"CurrentPress",
"CurrentTemp",
"ExtendedAlarm",
"_RecordCheckSum",
"_Reserved_1",
"_Reserved_2",
"_MaskSelector_2_1",
"_MaskSelector_2_2",
};
}
class AlarmMask
{
public const byte ALARM_REBOOT = 0; // immer An
public const byte ALARM_LOW_BATTERY = 1;
public const byte ALARM_VERY_LOW_BATTERY = 2; /* For consistency with st_alarm_bit_t only */
public const byte ALARM_CONFIG_ERROR = 3;
public const byte ALARM_EMPTY_PIPE = 4;
public const byte ALARM_MAGNETIC_TAMPER = 5; /* For consistency with st_alarm_bit_t only */
public const byte ALARM_REVERSE_FLOW = 6;
public const byte ALARM_SUSPECT_LEAK = 7;
public const byte ALARM_BROKEN_PIPE = 8;
public const byte ALARM_LOW_PRESSURE = 9;
public const byte ALARM_HIGH_PRESSURE = 10;
public const byte ALARM_LOW_TEMPERATURE = 11;
public const byte ALARM_HIGH_TEMPERATURE = 12;
public const byte ALARM_RADIO_ERROR = 13;
public const byte ALARM_METROLOGY_PARAMS = 14;
public const byte ALARM_METROLOGY_MEASURE = 15;
public const byte ALARM_MAX = 16;
public static string[] BitMask = new string[]
{
"ALARM_REBOOT",
"ALARM_LOW_BATTERY",
"ALARM_VERY_LOW_BATTERY",
"ALARM_CONFIG_ERROR",
"ALARM_EMPTY_PIPE",
"ALARM_MAGNETIC_TAMPER",
"ALARM_REVERSE_FLOW",
"ALARM_SUSPECT_LEAK",
"ALARM_BROKEN_PIPE",
"ALARM_LOW_PRESSURE",
"ALARM_HIGH_PRESSURE",
"ALARM_LOW_TEMPERATURE",
"ALARM_HIGH_TEMPERATURE",
"ALARM_RADIO_ERROR",
"ALARM_METROLOGY_PARAMS",
"ALARM_METROLOGY_MEASURE",
"ALARM_MAX",
};
};
}
}