Upload files to "Source Code Mobile"

This commit is contained in:
Dwikyyy 2026-07-30 12:50:48 +07:00
parent 154d221aa3
commit 9e88326d9a
5 changed files with 817 additions and 0 deletions

View File

@ -0,0 +1,57 @@
class ACModel {
final bool power;
final String mode;
final int temp;
final String fan;
final bool swing;
final String controlMode;
ACModel({
required this.power,
required this.mode,
required this.temp,
required this.fan,
required this.swing,
required this.controlMode,
});
factory ACModel.fromMap(Map<dynamic, dynamic> json) {
return ACModel(
power: json['power'] ?? false,
mode: json['mode']?.toString().toUpperCase() ?? 'COOL',
temp: json['temp'] ?? 24,
fan: json['fan']?.toString().toUpperCase() ?? 'AUTO',
swing: json['swing'] == true,
controlMode: json['control_mode']?.toString().toLowerCase() ?? 'auto',
);
}
Map<String, dynamic> toMap() {
return {
'power': power,
'mode': mode,
'temp': temp,
'fan': fan,
'swing': swing,
'control_mode': controlMode,
};
}
ACModel copyWith({
bool? power,
String? mode,
int? temp,
String? fan,
bool? swing,
String? controlMode,
}) {
return ACModel(
power: power ?? this.power,
mode: mode ?? this.mode,
temp: temp ?? this.temp,
fan: fan ?? this.fan,
swing: swing ?? this.swing,
controlMode: controlMode ?? this.controlMode,
);
}
}

View File

@ -0,0 +1,626 @@
class ACProtocol {
final int id;
final String protocolName;
final String displayName;
final String description;
final bool hasModel;
final List<String> modelNames;
ACProtocol({
required this.id,
required this.protocolName,
required this.displayName,
required this.description,
required this.hasModel,
required this.modelNames,
});
}
// Data dari ESP32 Script - 67 Protocol AC
final List<ACProtocol> acProtocols = [
ACProtocol(
id: 0,
protocolName: 'PANASONIC_AC',
displayName: 'Panasonic',
description: 'Panasonic AC',
hasModel: true,
modelNames: ['LKE', 'NKE', 'DKE', 'JKE', 'CKP', 'RKR'],
),
ACProtocol(
id: 1,
protocolName: 'FUJITSU_AC',
displayName: 'Fujitsu',
description: 'Fujitsu AC',
hasModel: true,
modelNames: ['ARDB1', 'ARRAH2E', 'ARREB1E', 'ARJW2', 'ARRY4', 'ARREW4E'],
),
ACProtocol(
id: 2,
protocolName: 'DAIKIN',
displayName: 'Daikin',
description: 'Daikin AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 3,
protocolName: 'DAIKIN2',
displayName: 'Daikin 2',
description: 'Daikin 2 AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 4,
protocolName: 'DAIKIN64',
displayName: 'Daikin 64-bit',
description: 'Daikin 64-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 5,
protocolName: 'DAIKIN128',
displayName: 'Daikin 128-bit',
description: 'Daikin 128-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 6,
protocolName: 'DAIKIN152',
displayName: 'Daikin 152-bit',
description: 'Daikin 152-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 7,
protocolName: 'DAIKIN160',
displayName: 'Daikin 160-bit',
description: 'Daikin 160-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 8,
protocolName: 'DAIKIN176',
displayName: 'Daikin 176-bit',
description: 'Daikin 176-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 9,
protocolName: 'DAIKIN200',
displayName: 'Daikin 200-bit',
description: 'Daikin 200-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 10,
protocolName: 'DAIKIN216',
displayName: 'Daikin 216-bit',
description: 'Daikin 216-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 11,
protocolName: 'DAIKIN312',
displayName: 'Daikin 312-bit',
description: 'Daikin 312-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 12,
protocolName: 'MITSUBISHI_AC',
displayName: 'Mitsubishi',
description: 'Mitsubishi Electric AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 13,
protocolName: 'MITSUBISHI112',
displayName: 'Mitsubishi 112-bit',
description: 'Mitsubishi 112-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 14,
protocolName: 'MITSUBISHI136',
displayName: 'Mitsubishi 136-bit',
description: 'Mitsubishi 136-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 15,
protocolName: 'MITSUBISHI_HEAVY_88',
displayName: 'Mitsubishi Heavy 88-bit',
description: 'Mitsubishi Heavy 88-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 16,
protocolName: 'MITSUBISHI_HEAVY_152',
displayName: 'Mitsubishi Heavy 152-bit',
description: 'Mitsubishi Heavy 152-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 17,
protocolName: 'HITACHI_AC',
displayName: 'Hitachi',
description: 'Hitachi AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 18,
protocolName: 'HITACHI_AC1',
displayName: 'Hitachi AC1',
description: 'Hitachi AC1',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 19,
protocolName: 'HITACHI_AC264',
displayName: 'Hitachi AC264',
description: 'Hitachi AC264',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 20,
protocolName: 'HITACHI_AC296',
displayName: 'Hitachi AC296',
description: 'Hitachi AC296',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 21,
protocolName: 'HITACHI_AC344',
displayName: 'Hitachi AC344',
description: 'Hitachi AC344',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 22,
protocolName: 'HITACHI_AC424',
displayName: 'Hitachi AC424',
description: 'Hitachi AC424',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 23,
protocolName: 'LG',
displayName: 'LG',
description: 'LG AC',
hasModel: true,
modelNames: [
'GE6711AR2853M',
'LG6711A20083V',
'AKB74955603',
'AKB73757604',
],
),
ACProtocol(
id: 24,
protocolName: 'LG2',
displayName: 'LG 2',
description: 'LG2 AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 25,
protocolName: 'SAMSUNG_AC',
displayName: 'Samsung',
description: 'Samsung AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 26,
protocolName: 'SAMSUNG36',
displayName: 'Samsung 36-bit',
description: 'Samsung 36-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 27,
protocolName: 'SHARP_AC',
displayName: 'Sharp',
description: 'Sharp AC',
hasModel: true,
modelNames: ['A705', 'A903', 'A907'],
),
ACProtocol(
id: 28,
protocolName: 'GREE',
displayName: 'Gree',
description: 'Gree AC',
hasModel: true,
modelNames: ['YAW1F', 'YBOFB', 'YX1FSF'],
),
ACProtocol(
id: 29,
protocolName: 'KELVINATOR',
displayName: 'Kelvinator',
description: 'Kelvinator AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 30,
protocolName: 'COOLIX',
displayName: 'Coolix/Midea',
description: 'Coolix/Midea AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 31,
protocolName: 'COOLIX48',
displayName: 'Coolix 48-bit',
description: 'Coolix 48-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 32,
protocolName: 'MIDEA',
displayName: 'Midea',
description: 'Midea AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 33,
protocolName: 'MIDEA24',
displayName: 'Midea 24-bit',
description: 'Midea 24-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 34,
protocolName: 'WHIRLPOOL_AC',
displayName: 'Whirlpool',
description: 'Whirlpool AC',
hasModel: true,
modelNames: ['DG11J13A', 'DG11J191'],
),
ACProtocol(
id: 35,
protocolName: 'HAIER_AC',
displayName: 'Haier',
description: 'Haier AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 36,
protocolName: 'HAIER_AC_YRW02',
displayName: 'Haier YRW02',
description: 'Haier YRW02 AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 37,
protocolName: 'HAIER_AC160',
displayName: 'Haier 160-bit',
description: 'Haier 160-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 38,
protocolName: 'HAIER_AC176',
displayName: 'Haier 176-bit',
description: 'Haier 176-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 39,
protocolName: 'CARRIER_AC',
displayName: 'Carrier',
description: 'Carrier AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 40,
protocolName: 'CARRIER_AC84',
displayName: 'Carrier 84-bit',
description: 'Carrier 84-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 41,
protocolName: 'CARRIER_AC128',
displayName: 'Carrier 128-bit',
description: 'Carrier 128-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 42,
protocolName: 'TCL112AC',
displayName: 'TCL 112-bit',
description: 'TCL 112-bit AC',
hasModel: true,
modelNames: ['TAC09CHSD', 'GZ055BE1'],
),
ACProtocol(
id: 43,
protocolName: 'TCL96AC',
displayName: 'TCL 96-bit',
description: 'TCL 96-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 44,
protocolName: 'SANYO_AC',
displayName: 'Sanyo',
description: 'Sanyo AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 45,
protocolName: 'SANYO_AC152',
displayName: 'Sanyo 152-bit',
description: 'Sanyo 152-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 46,
protocolName: 'TOSHIBA_AC',
displayName: 'Toshiba',
description: 'Toshiba AC',
hasModel: true,
modelNames: ['GENERICREMOTE_A', 'GENERICREMOTE_B'],
),
ACProtocol(
id: 47,
protocolName: 'ELECTRA_AC',
displayName: 'Electra/AUX/Frigidaire',
description: 'Electra/AUX/Frigidaire AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 48,
protocolName: 'NEOCLIMA',
displayName: 'Neoclima',
description: 'Neoclima AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 49,
protocolName: 'VOLTAS',
displayName: 'Voltas',
description: 'Voltas AC',
hasModel: true,
modelNames: ['122LZF'],
),
ACProtocol(
id: 50,
protocolName: 'VESTEL_AC',
displayName: 'Vestel',
description: 'Vestel AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 51,
protocolName: 'TROTEC',
displayName: 'Trotec',
description: 'Trotec AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 52,
protocolName: 'TROTEC_3550',
displayName: 'Trotec 3550',
description: 'Trotec 3550 AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 53,
protocolName: 'AMCOR',
displayName: 'Amcor',
description: 'Amcor AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 54,
protocolName: 'ARGO',
displayName: 'Argo',
description: 'Argo AC',
hasModel: true,
modelNames: ['SAC_WREM2', 'SAC_WREM3'],
),
ACProtocol(
id: 55,
protocolName: 'CORONA_AC',
displayName: 'Corona',
description: 'Corona AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 56,
protocolName: 'DELONGHI_AC',
displayName: 'DeLonghi',
description: 'DeLonghi AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 57,
protocolName: 'ECOCLIM',
displayName: 'EcoClim',
description: 'EcoClim AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 58,
protocolName: 'EUROM',
displayName: 'Eurom',
description: 'Eurom AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 59,
protocolName: 'GOODWEATHER',
displayName: 'Goodweather',
description: 'Goodweather AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 60,
protocolName: 'KELON',
displayName: 'Kelon/Hisense',
description: 'Kelon/Hisense AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 61,
protocolName: 'KELON168',
displayName: 'Kelon 168-bit',
description: 'Kelon 168-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 62,
protocolName: 'MIRAGE',
displayName: 'Mirage',
description: 'Mirage AC',
hasModel: true,
modelNames: ['KKG9AC1', 'KKG29AC1'],
),
ACProtocol(
id: 63,
protocolName: 'RHOSS',
displayName: 'Rhoss',
description: 'Rhoss AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 64,
protocolName: 'TEKNOPOINT',
displayName: 'Teknopoint',
description: 'Teknopoint AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 65,
protocolName: 'TRANSCOLD',
displayName: 'Transcold',
description: 'Transcold AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 66,
protocolName: 'TRUMA',
displayName: 'Truma',
description: 'Truma AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 67,
protocolName: 'YORK',
displayName: 'York',
description: 'York AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 68,
protocolName: 'AIRTON',
displayName: 'Airton',
description: 'Airton AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 69,
protocolName: 'AIRWELL',
displayName: 'Airwell',
description: 'Airwell AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 70,
protocolName: 'CLIMABUTLER',
displayName: 'Clima-Butler',
description: 'Clima-Butler AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 71,
protocolName: 'TECO',
displayName: 'Teco/Alaska',
description: 'Teco/Alaska AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 72,
protocolName: 'WHYNTER',
displayName: 'Whynter',
description: 'Whynter AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 73,
protocolName: 'BOSCH144',
displayName: 'Bosch 144-bit',
description: 'Bosch 144-bit AC',
hasModel: false,
modelNames: [],
),
ACProtocol(
id: 74,
protocolName: 'TECHNIBEL_AC',
displayName: 'Technibel',
description: 'Technibel AC',
hasModel: false,
modelNames: [],
),
];

View File

@ -0,0 +1,42 @@
class ControlHistoryModel {
final String action;
final String source;
final String timestamp;
final int rawTimestamp;
ControlHistoryModel({
required this.action,
required this.source,
required this.timestamp,
required this.rawTimestamp,
});
factory ControlHistoryModel.fromMap(Map<dynamic, dynamic> json) {
final int ts = json['timestamp'] is int ? json['timestamp'] : 0;
return ControlHistoryModel(
action: json['action'] ?? '',
source: json['source'] ?? '',
timestamp: _parseTimestamp(json['timestamp']),
rawTimestamp: ts,
);
}
Map<String, dynamic> toMap() {
return {
'action': action,
'source': source,
'timestamp': timestamp,
'rawTimestamp': rawTimestamp,
};
}
}
String _parseTimestamp(dynamic value) {
if (value == null) return '';
if (value is int) {
final dt = DateTime.fromMillisecondsSinceEpoch(value * 1000);
return "${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')} "
"${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}:${dt.second.toString().padLeft(2, '0')}";
}
return value.toString();
}

View File

@ -0,0 +1,60 @@
class HistoryModel {
final double temperature;
final double humidity;
final double co2;
final double pm25;
final String overallStatus;
final String timestamp;
// ac_action sudah dihapus dari script ESP32 terbaru, gunakan default '-'
final String acAction;
HistoryModel({
required this.temperature,
required this.humidity,
required this.co2,
required this.pm25,
required this.overallStatus,
required this.timestamp,
this.acAction = '-',
});
factory HistoryModel.fromMap(Map<dynamic, dynamic> json) {
return HistoryModel(
// Support both ESP32 field names and Flutter field names
temperature: ((json['temperature'] ?? json['suhu']) ?? 0).toDouble(),
humidity: ((json['humidity'] ?? json['kelembapan']) ?? 0).toDouble(),
co2: ((json['co2'] ?? json['co2_ppm']) ?? 0).toDouble(),
pm25: ((json['pm25'] ?? json['pm25_ugm3']) ?? 0).toDouble(),
overallStatus:
(json['overall_status'] ?? json['status_keseluruhan'] ?? ''),
timestamp: _parseTimestamp(json['timestamp']),
// Backward compatible: gunakan ac_action jika ada, jika tidak gunakan '-'
acAction: json['ac_action'] ?? '-',
);
}
Map<String, dynamic> toMap() {
return {
'temperature': temperature,
'humidity': humidity,
'co2': co2,
'pm25': pm25,
'overall_status': overallStatus,
'timestamp': timestamp,
'ac_action': acAction,
};
}
}
String _parseTimestamp(dynamic value) {
if (value == null) return '';
if (value is int) {
// ESP32 mengirim unix timestamp dalam detik, konversi ke milliseconds
// Jika value > 10000000000 berarti sudah dalam milliseconds
final timestampMs = value > 10000000000 ? value : value * 1000;
final dt = DateTime.fromMillisecondsSinceEpoch(timestampMs);
return "${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')} "
"${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}:${dt.second.toString().padLeft(2, '0')}";
}
return value.toString();
}

View File

@ -0,0 +1,32 @@
class IrReceivedModel {
final String protocol;
final String code;
final int bits;
final String timestamp;
IrReceivedModel({
required this.protocol,
required this.code,
required this.bits,
required this.timestamp,
});
factory IrReceivedModel.fromMap(Map<dynamic, dynamic> json) {
return IrReceivedModel(
protocol: json['protocol'] ?? 'UNKNOWN',
code: json['code'] ?? '0x0',
bits: json['bits'] ?? 0,
timestamp: _parseTimestamp(json['timestamp']),
);
}
}
String _parseTimestamp(dynamic value) {
if (value == null) return '';
if (value is int) {
final dt = DateTime.fromMillisecondsSinceEpoch(value * 1000);
return '${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')} '
'${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}:${dt.second.toString().padLeft(2, '0')}';
}
return value.toString();
}