unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uMQTTComps, StdCtrls, Grids, BaseGrid, AdvGrid, uMQTT ,uSysLog, ExtCtrls, DateUtils, ComCtrls, Menus, ScktComp, inifiles, FarmSMem, JsonConvertor, Buttons, IntNum, NumEdit, ZConnection, MQTT, ZAbstractDataset, ZDataset, DB, ZAbstractRODataset, FANTrend; type TfrmMain = class(TForm) initTimer: TTimer; StatusBar1: TStatusBar; MainMenu1: TMainMenu; ListBox1: TListBox; File2: TMenuItem; ProgramExit1: TMenuItem; ZConnection1: TZConnection; ZReadOnlyQuery1: TZReadOnlyQuery; ZQuery1: TZQuery; N3: TMenuItem; CONFIG1: TMenuItem; NILM2: TMenuItem; Device1: TMenuItem; N1: TMenuItem; Panel1: TPanel; TreeView1: TTreeView; Splitter1: TSplitter; Panel2: TPanel; FANTrend1: TFANTrend; Timer1: TTimer; procedure initTimerTimer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ProgramExit1Click(Sender: TObject); procedure CONFIG1Click(Sender: TObject); procedure NILM2Click(Sender: TObject); procedure Device1Click(Sender: TObject); procedure TreeView1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } select_nilmID, select_nilm_idxNo : integer; public //read_gwid : integer; fNILM : array [1..max_gw] of TNILM; appPath : string; hubPort : integer; dbIP, dbPW, dbUser, dbSchema, mqtt_topic, ClientID : string; dbPort, brokerPort : integer; brokerIP, mqtt_user, mqtt_pw : string; old_NilmID : integer; procedure PrintLog(msg : String); procedure ClearIOTGW(); procedure insertSQL(sql : string); procedure ShowNilmTreeView(); end; var frmMain: TfrmMain; implementation {$R *.dfm} uses global, uConfigMQTT, uConfigNILM, uDevConfig; procedure TfrmMain.ClearIOTGW(); var p, i : integer; begin for p:=1 to max_gw do begin fNILM[p].idxNo := 0; fNILM[p]._TOPIC := ''; fNILM[p]._NAME := ''; for i:=1 to 3 do begin fNILM[p]._VALUE.PF[i] := 0.0; fNILM[p]._VALUE.Vrms[i] := 0.0; fNILM[p]._VALUE.Irms[i] := 0.0; fNILM[p]._VALUE._Var[i] := 0.0; fNILM[p]._VALUE.Va[i] := 0.0; fNILM[p]._VALUE.Pwr[i] := 0.0; fNILM[p]._VALUE.Gyro[i] := 0.0; fNILM[p]._VALUE.Accel[i] := 0.0; end; fNILM[p]._VALUE.TempC := 0; fNILM[p].rcvCount := 0; fNILM[p].oldRcvCount := 0; end; end; procedure TfrmMain.ShowNilmTreeView(); var nilmID : integer; subNode : TTreenode; begin TreeView1.Items.Clear; for nilmID:=1 to max_gw do begin if fNILM[nilmID].idxNo> 0 then begin subNode := TreeView1.Items.AddChild(nil, format('%.5d',[nilmID])); TreeView1.items.AddChild(subNode, 'IDXNO:'+inttostr(fNILM[nilmID].idxNo)); TreeView1.items.AddChild(subNode, 'NAME :'+fNILM[nilmID]._NAME); TreeView1.items.AddChild(subNode, 'TOPIC:'+fNILM[nilmID]._TOPIC); end; end; end; procedure TfrmMain.PrintLog(msg : string); begin if ListBox1.Items.Count >= 300 then ListBox1.Items.Clear; ListBox1.Items.Insert(0, FormatDateTime('hh:nn:ss :: ',now)+msg); end; procedure TfrmMain.initTimerTimer(Sender: TObject); var ini : TInifile; pwd : string; begin FANTrend1.SetItem(1, 'PF', clLime, 1, 0); FANTrend1.SetItem(2, 'Vrms', clYellow, 300, 0); FANTrend1.SetItem(3, 'Irms', clSkyBlue, 10, 0); FANTrend1.SetItem(4, 'Pwr', clRed, 5000, 0); old_NilmID := 0; ListBox1.Clear; mqtt_topic := ''; mqtt_topic := 'QST/NILM/LVDT/#'; pwd := ''; pwd := appPath+'NILM_Manager.ini'; if FileExists(pwd) then begin ini := TInifile.Create(pwd); with ini do begin mqtt_topic := ReadString('MQTT','TOPIC',mqtt_topic); brokerIP := ReadString('MQTT','BrokerIP','183.111.125.203'); brokerPort := ReadInteger('MQTT','BrokerPort',1883); ClientID := ReadString('MQTT','ClientID','NILM_1st'); mqtt_user := ReadString('MQTT','User','qsentech'); mqtt_pw := ReadString('MQTT','Password','qsentech!1233'); dbIP := ReadString('DATABASE','IP','192.168.200.199'); dbUser := ReadString('DATABASE','User','root'); dbPW := ReadString('DATABASE','PW','1233'); dbSchema := ReadString('DATABASE','Schema','nilm'); dbPort := ReadInteger('DATABASE','Port',3306); hubPort := ReadInteger('MQTT_HUB','Port',6969); end; ini.Free; end; if ZConnection1.Connected then ZConnection1.disConnect(); Sleep(300); ZConnection1.HostName := dbIP; ZConnection1.Port := dbPort; ZConnection1.User := dbUser; ZConnection1.Password := dbPW; ZConnection1.Database := dbSchema; frmNILM.ShowNILM(); frmDevConfig.ShowDev(); ShowNilmTreeView(); Timer1.Enabled := True; initTimer.Enabled := false; end; procedure TfrmMain.FormCreate(Sender: TObject); begin appPath := ''; appPath := ExtractFilePath(Application.ExeName); ClearIOTGW(); end; procedure TfrmMain.insertSQL(sql : string); begin try try if not ZConnection1.Connected then ZConnection1.Connect(); if ZConnection1.Connected then begin ZQuery1.Active := false; ZQuery1.SQL.Clear; ZQuery1.SQL.Add(sql); ZQuery1.ExecSQL; end; finally if ZConnection1.Connected then ZConnection1.Disconnect; end; except on e : exception do begin printlog('Database Connect Error :: '+e.Message); end; end; end; procedure TfrmMain.ProgramExit1Click(Sender: TObject); begin frmMain.Close; end; procedure TfrmMain.CONFIG1Click(Sender: TObject); begin frmConfigMQTT.Show; end; procedure TfrmMain.NILM2Click(Sender: TObject); begin frmNILM.Show; end; procedure TfrmMain.Device1Click(Sender: TObject); begin frmDevConfig.Show; end; procedure TfrmMain.TreeView1Click(Sender: TObject); var str1, str : string; li : LongInt; sub : TTreeNode; begin if TreeView1.Selected = nil then exit; str := TreeView1.Selected.Text; Statusbar1.Panels.Items[0].text := str; if Pos(':', str)<= 0 then begin select_nilmID := StrTointDef(str, 0); end; if TreeView1.Selected.HasChildren then begin sub := TreeView1.Selected.getFirstChild; str := sub.Text; str1 := Copy(str, Pos(':', str)+1, Length(str)-Pos(':', str)); select_nilm_idxNo := StrTointDef(str1, 0); printlog(str1); end; end; procedure TfrmMain.Timer1Timer(Sender: TObject); var vPF, vVrms, vIrms, vPwr : single; begin if select_nilmID<= 0 then exit; try try if not frmMain.ZConnection1.Connected then frmMain.ZConnection1.Connect(); if frmMain.ZConnection1.Connected then begin ZReadOnlyQuery1.Active := false; ZReadOnlyQuery1.SQL.Clear; ZReadOnlyQuery1.SQL.Add('SELECT * FROM nilm_value WHERE NilmID='+inttostr(select_nilmID)); ZReadOnlyQuery1.Open; if ZReadOnlyQuery1.RecordCount> 0 then begin vPF := ZReadOnlyQuery1.FieldByName('pf_1').AsFloat; vVrms := ZReadOnlyQuery1.FieldByName('Vrms_1').AsFloat; vIrms := ZReadOnlyQuery1.FieldByName('Irms_1').AsFloat; vPwr := ZReadOnlyQuery1.FieldByName('Pwr_1').AsFloat; end; end; finally if frmMain.ZConnection1.Connected then frmMain.ZConnection1.Disconnect; end; except on e : exception do begin frmMain.printlog('Database Connect Error :: '+e.Message); end; end; FANTrend1.Add(1, vPF, formatdatetime('hh:nn:ss',now())); FANTrend1.Add(2, vVrms, formatdatetime('hh:nn:ss',now())); FANTrend1.Add(3, vIrms, formatdatetime('hh:nn:ss',now())); FANTrend1.Add(4, vPwr, formatdatetime('hh:nn:ss',now())); end; end.