Changes for page Demo for Smart Office, Factory
Last modified by Hera Guo on 2024/11/11 17:08
Summary
-
Page properties (1 modified, 0 added, 0 removed)
-
Attachments (0 modified, 18 added, 0 removed)
- 1730862483514-101.png
- 1730862584519-902.png
- 1730863708259-750.png
- 1730863750414-979.png
- 1730864045747-876.png
- 1730864077395-395.png
- 1730864117808-484.png
- 1730864159071-895.png
- 1730864207037-477.png
- 1730864250506-111.png
- 1730864293216-991.png
- 1730864331859-740.png
- 1730864460314-611.png
- 1730864617480-221.png
- 1730864676542-406.png
- 1730864784118-474.png
- 1730865053380-293.png
- 屏幕截图 2024-11-04 135045.png
Details
- Page properties
-
- Content
-
... ... @@ -82,9 +82,8 @@ 82 82 83 83 High Temperature、Low Temperature、High humidity、Low humidity、Low voltage、Device Disconnected 84 84 85 -[[image: 1730854677036-426.png]]85 +[[image:屏幕截图 2024-11-04 135045.png]] 86 86 87 - 88 88 = 4.configuration details = 89 89 90 90 After understanding the architecture and layering of the complete project, we can start configuring it ... ... @@ -121,7 +121,6 @@ 121 121 122 122 ==== 4.1.2.1、Configure the interface of the third layer Davies. ==== 123 123 124 - 125 125 ==== 4.1.2.2、Configure the interface of the second layer asset ==== 126 126 127 127 ===== 4.1.2.2.1 Equipment distribution diagram: ===== ... ... @@ -256,11 +256,9 @@ 256 256 return res; 257 257 {{/code}} 258 258 259 -==== [[image:1730770875793-351.png]] ==== 257 +(% class="wikigeneratedid" id="H" %) 258 +[[image:1730770875793-351.png]]**Actions:**We need to implement the function of entering the details interface through the corresponding device icon, so in this module, we need to add actions to achieve redirection 260 260 261 -(% class="wikigeneratedid" id="HActions" %) 262 -**Actions:**We need to implement the function of entering the details interface through the corresponding device icon, so in this module, we need to add actions to achieve redirection 263 - 264 264 {{code language="none"}} 265 265 var entitySubType; 266 266 var $injector = widgetContext.$scope.$injector; ... ... @@ -322,6 +322,7 @@ 322 322 323 323 ===== 4.1.2.2.2 Device List ===== 324 324 321 +(% class="wikigeneratedid" id="HDataFF1A" %) 325 325 **Data:** 326 326 327 327 [[image:1730771199343-553.png]] ... ... @@ -431,8 +431,7 @@ 431 431 } 432 432 {{/code}} 433 433 434 -==== ==== 435 - 431 +(% class="wikigeneratedid" id="H" %) 436 436 Delete device:Implementation function: Device deletion 437 437 438 438 [[image:1730771318657-502.png]] ... ... @@ -466,7 +466,6 @@ 466 466 467 467 {{/code}} 468 468 469 - 470 470 jump:Implementation function: Jump to the device details page 471 471 472 472 [[image:1730771386258-676.png]] ... ... @@ -528,8 +528,7 @@ 528 528 } 529 529 {{/code}} 530 530 531 -==== ==== 532 - 526 +(% class="wikigeneratedid" id="H-1" %) 533 533 Add device:Implementation function: Add device 534 534 535 535 [[image:1730771441589-122.png]] ... ... @@ -599,7 +599,7 @@ 599 599 600 600 ==== ==== 601 601 602 -===== **4.1.2.2. 2Asset Alarm:** =====596 +===== **4.1.2.2.3 Asset Alarm:** ===== 603 603 604 604 **Data:** 605 605 ... ... @@ -649,7 +649,9 @@ 649 649 650 650 [[image:1730710990334-601.png||height="772" width="1433"]] 651 651 652 -* In this demo, exclusive map icons were set as follows: 646 +* ((( 647 +In this demo, exclusive map icons were set as follows: 648 +))) 653 653 654 654 {{code language="none"}} 655 655 var res = { ... ... @@ -679,6 +679,400 @@ 679 679 680 680 == 4.2 Alarm configuration details == 681 681 678 +=== 4.2.1 High temperature === 679 + 680 +Creat: 681 + 682 +[[image:1730862483514-101.png||height="750" width="1407"]] 683 + 684 +Clear: 685 + 686 +[[image:1730862584519-902.png||height="758" width="1404"]] 687 + 688 +=== 4.2.2 Low Temperature === 689 + 690 +Creat: 691 + 692 +[[image:1730863708259-750.png||height="752" width="1403"]] 693 + 694 +Clear: 695 + 696 +[[image:1730863750414-979.png||height="746" width="1403"]] 697 + 698 +=== 4.2.3 High humidity === 699 + 700 +Creat: 701 + 702 +[[image:1730864045747-876.png||height="752" width="1396"]] 703 + 704 +Clear: 705 + 706 +[[image:1730864077395-395.png||height="735" width="1393"]] 707 + 708 +=== 4.2.4 Low humidity === 709 + 710 +Creat: 711 + 712 +[[image:1730864117808-484.png||height="741" width="1392"]] 713 + 714 +Clear: 715 + 716 +[[image:1730864159071-895.png||height="745" width="1392"]] 717 + 718 +=== 4.2.5 Low voltage === 719 + 720 +Creat: 721 + 722 +[[image:1730864207037-477.png||height="740" width="1388"]] 723 + 724 +Clear: 725 + 726 +[[image:1730864250506-111.png||height="735" width="1389"]] 727 + 728 +=== 4.2.6 Device Disconnected === 729 + 730 +Creat: 731 + 732 +[[image:1730864293216-991.png||height="739" width="1387"]] 733 + 734 +Clear: 735 + 736 +[[image:1730864331859-740.png||height="735" width="1385"]] 737 + 682 682 == 4.3 Rule chain configuration details == 683 683 684 -= 5. = 740 +[[image:1730864784118-474.png]] 741 + 742 +**Script:**Email configuration for sending device alarm information 743 + 744 +[[image:1730864676542-406.png||height="732" width="1384"]] 745 + 746 +{{code language="none"}} 747 +function locatime(timenumber){ 748 + var date = new Date(timenumber) 749 + return date.toLocaleDateString() + ' ' + date.toLocaleTimeString() 750 +} 751 +var name = msg.name 752 +var devicename = msg.originatorName 753 +var label = msg.originatorLabel 754 +var status = msg.status 755 +var detaildata =JSON.parse(msg.details.data) 756 +var tempswitch 757 + 758 +if (name != "Device Disconnected") { 759 + //detaildata=JSON.parse(msg.details.data) 760 + if (detaildata.Temperature_alarm_switch == true) { 761 + tempswitch = "open" 762 + } else { 763 + tempswitch = "close" 764 + } 765 + var humswitch 766 + if (detaildata.Humidity_alarm_switch == true) { 767 + humswitch = "open" 768 + } else { 769 + humswitch = "close" 770 + } 771 + var batswitch 772 + if (detaildata.Voltage_alarm_switch == true) { 773 + batswitch = "open" 774 + } else { 775 + batswitch = "close" 776 + } 777 + var str2 = "<p>-- Temperature alarm switch status: " + 778 + tempswitch + "</p>" + 779 + "<p>-- Humidity alarm switch status: " + humswitch + 780 + "</p>" + 781 + "<p>-- Voltage alarm switch status: " + batswitch 782 +} 783 + 784 +if (name == "High Temperature" && status == 785 + "ACTIVE_UNACK") { 786 + var emailstr = 787 + "<div><p><span style='color: black; font-weight: bold'>" + 788 + "Device " + label + " has alarm:</span></p>" + 789 + "<p><span style='color: red; font-weight: bold'>-- High Temperature Alarm</span></p>" + 790 + "<p>-- Current Temperature : " + detaildata 791 + .TempC_SHT + "</p><br>" + 792 + "<p>Device Configure:</p>" + 793 + "<p>-- Temperature Threshold : min: " + detaildata 794 + .Low_temperature_alarm + ", max: " + detaildata 795 + .High_temperature_alarm + "</p>" + 796 + "<p>-- Humidity Threshold: min: " + detaildata 797 + .Low_humidity_alarm + ", max:" + detaildata 798 + .High_humidity_alarm + "</p>" + 799 + "<p>-- Battery threshold: min: " + detaildata 800 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 801 + return { 802 + msg: { 803 + "data": emailstr 804 + }, 805 + metadata: metadata, 806 + msgType: msgType 807 + }; 808 +} else if (name == "Low Temperature" && status == 809 + "ACTIVE_UNACK") { 810 + var emailstr = 811 + "<div><p><span style='color: black; font-weight: bold'>" + 812 + "Device " + label + " has alarm:</span></p>" + 813 + "<p><span style='color: red; font-weight: bold'>-- Low Temperature Alarm</span></p>" + 814 + "<p>-- Current Temperature : " + detaildata 815 + .TempC_SHT + "</p><br>" + 816 + "<p>Device Configure:</p>" + 817 + "<p>-- Temperature Threshold : min: " + detaildata 818 + .Low_temperature_alarm + ", max: " + detaildata 819 + .High_temperature_alarm + "</p>" + 820 + "<p>-- Humidity Threshold: min: " + detaildata 821 + .Low_humidity_alarm + ", max:" + detaildata 822 + .High_humidity_alarm + "</p>" + 823 + "<p>-- Battery threshold: min: " + detaildata 824 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 825 + 826 + return { 827 + msg: { 828 + "data": emailstr 829 + }, 830 + metadata: metadata, 831 + msgType: msgType 832 + }; 833 + 834 +} else if (name == "Device Disconnected" && status == 835 + "ACTIVE_UNACK") { 836 + var time1 = locatime(Number(detaildata.lastActivityTime)) 837 + //var time1 = detaildata.lastActivityTime 838 + // var chazhi = parseInt((detaildata.inactivityAlarmTime-detaildata.lastActivityTime)/1000/60) 839 + // var emailstr = 840 + // "<div><p><span style='color: red; font-weight: bold'>" + 841 + // "Device " + label + " has Alarm</span></p><p>Last activity time: "+time1+"</p><p>Last Uplink: 21"+"minutes ago</p></div>" 842 + 843 + var emailstr ="Device " + label + " has Alarm##Last activity time: "+time1+"##Last Uplink: 21minutes ago" 844 + var newType = "POST_TELEMETRY_REQUEST" 845 + return { 846 + msg:emailstr, 847 + metadata: metadata, 848 + msgType: newType 849 + } 850 +} else if (name == "High humidity" && status == 851 + "ACTIVE_UNACK") { 852 + var emailstr = 853 + "<div><p><span style='color: black; font-weight: bold'>" + 854 + "Device " + label + " has alarm:</span></p>" + 855 + "<p><span style='color: red; font-weight: bold'>-- High Humidity Alarm</span></p>" + 856 + "<p>-- Current Temperature : " + detaildata 857 + .Hum_SHT + "</p><br>" + 858 + "<p>Device Configure:</p>" + 859 + "<p>-- Temperature Threshold : min: " + detaildata 860 + .Low_temperature_alarm + ", max: " + detaildata 861 + .High_temperature_alarm + "</p>" + 862 + "<p>-- Humidity Threshold: min: " + detaildata 863 + .Low_humidity_alarm + ", max:" + detaildata 864 + .High_humidity_alarm + "</p>" + 865 + "<p>-- Battery threshold: min: " + detaildata 866 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 867 + 868 + return { 869 + msg: { 870 + "data": emailstr 871 + }, 872 + metadata: metadata, 873 + msgType: msgType 874 + }; 875 +} else if (name == "Low humidity" && status == 876 + "ACTIVE_UNACK") { 877 + var emailstr = 878 + "<div><p><span style='color: black; font-weight: bold'>" + 879 + "Device " + label + " has alarm:</span></p>" + 880 + "<p><span style='color: red; font-weight: bold'>-- Low Humidity Alarm</span></p>" + 881 + "<p>-- Current Temperature : " + detaildata 882 + .Hum_SHT + "</p><br>" + 883 + "<p>Device Configure:</p>" + 884 + "<p>-- Temperature Threshold : min: " + detaildata 885 + .Low_temperature_alarm + ", max: " + detaildata 886 + .High_temperature_alarm + "</p>" + 887 + "<p>-- Humidity Threshold: min: " + detaildata 888 + .Low_humidity_alarm + ", max:" + detaildata 889 + .High_humidity_alarm + "</p>" + 890 + "<p>-- Battery threshold: min: " + detaildata 891 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 892 + 893 + return { 894 + msg: { 895 + "data": emailstr 896 + }, 897 + metadata: metadata, 898 + msgType: msgType 899 + }; 900 +} else if (name == "Low voltage" && status == 901 + "ACTIVE_UNACK") { 902 + var emailstr = 903 + "<div><p><span style='color: black; font-weight: bold'>" + 904 + "Device " + label + " has alarm:</span></p>" + 905 + "<p><span style='color: red; font-weight: bold'>-- Low Voltage Alarm</span></p>" + 906 + "<p>-- Current Temperature : " + detaildata.BatV + 907 + "</p><br>" + 908 + "<p>Device Configure:</p>" + 909 + "<p>-- Temperature Threshold : min: " + detaildata 910 + .Low_temperature_alarm + ", max: " + detaildata 911 + .High_temperature_alarm + "</p>" + 912 + "<p>-- Humidity Threshold: min: " + detaildata 913 + .Low_humidity_alarm + ", max:" + detaildata 914 + .High_humidity_alarm + "</p>" + 915 + "<p>-- Battery threshold: min: " + detaildata 916 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 917 + 918 + return { 919 + msg: { 920 + "data": emailstr 921 + }, 922 + metadata: metadata, 923 + msgType: msgType 924 + }; 925 +} else if (name == "High Temperature" && status == 926 + "CLEARED_UNACK") { 927 + var emailstr = 928 + "<div><p><span style='color: green; font-weight: bold'>Device " + 929 + label + 930 + " High Temperature Alarm Cleared</span></p>" + 931 + "<p>-- Current Temperature : " + detaildata 932 + .TempC_SHT + "</p><br>" + 933 + "<p>Device Configure:</p>" + 934 + "<p>-- Temperature Threshold : min: " + detaildata 935 + .Low_temperature_alarm + ", max: " + detaildata 936 + .High_temperature_alarm + "</p>" + 937 + "<p>-- Humidity Threshold: min: " + detaildata 938 + .Low_humidity_alarm + ", max:" + detaildata 939 + .High_humidity_alarm + "</p>" + 940 + "<p>-- Battery threshold: min: " + detaildata 941 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 942 + 943 + return { 944 + msg: { 945 + "data": emailstr 946 + }, 947 + metadata: metadata, 948 + msgType: msgType 949 + }; 950 +} else if (name == "Low Temperature" && status == 951 + "CLEARED_UNACK") { 952 + var emailstr = 953 + "<div><p><span style='color: green; font-weight: bold'>Device " + 954 + label + 955 + " Low Temperature Alarm Cleared</span></p>" + 956 + "<p>-- Current Temperature : " + detaildata 957 + .TempC_SHT + "</p><br>" + 958 + "<p>Device Configure:</p>" + 959 + "<p>-- Temperature Threshold : min: " + detaildata 960 + .Low_temperature_alarm + ", max: " + detaildata 961 + .High_temperature_alarm + "</p>" + 962 + "<p>-- Humidity Threshold: min: " + detaildata 963 + .Low_humidity_alarm + ", max:" + detaildata 964 + .High_humidity_alarm + "</p>" + 965 + "<p>-- Battery threshold: min: " + detaildata 966 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 967 + 968 + return { 969 + msg: { 970 + "data": emailstr 971 + }, 972 + metadata: metadata, 973 + msgType: msgType 974 + }; 975 +} else if (name == "High humidity" && status == 976 + "CLEARED_UNACK") { 977 + var emailstr = 978 + "<div><p><span style='color: green; font-weight: bold'>Device " + 979 + label + " High Humidity Alarm Cleared</span></p>" + 980 + "<p>-- Current Temperature : " + detaildata 981 + .Hum_SHT + "</p><br>" + 982 + "<p>Device Configure:</p>" + 983 + "<p>-- Temperature Threshold : min: " + detaildata 984 + .Low_temperature_alarm + ", max: " + detaildata 985 + .High_temperature_alarm + "</p>" + 986 + "<p>-- Humidity Threshold: min: " + detaildata 987 + .Low_humidity_alarm + ", max:" + detaildata 988 + .High_humidity_alarm + "</p>" + 989 + "<p>-- Battery threshold: min: " + detaildata 990 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 991 + 992 + return { 993 + msg: { 994 + "data": emailstr 995 + }, 996 + metadata: metadata, 997 + msgType: msgType 998 + }; 999 +} else if (name == "Low humidity" && status == 1000 + "CLEARED_UNACK") { 1001 + var emailstr = 1002 + "<div><p><span style='color: green; font-weight: bold'>Device " + 1003 + label + " Low Humidity Alarm Cleared</span></p>" + 1004 + "<p>-- Current Temperature : " + detaildata 1005 + .Hum_SHT + "</p><br>" + 1006 + "<p>Device Configure:</p>" + 1007 + "<p>-- Temperature Threshold : min: " + detaildata 1008 + .Low_temperature_alarm + ", max: " + detaildata 1009 + .High_temperature_alarm + "</p>" + 1010 + "<p>-- Humidity Threshold: min: " + detaildata 1011 + .Low_humidity_alarm + ", max:" + detaildata 1012 + .High_humidity_alarm + "</p>" + 1013 + "<p>-- Battery threshold: min: " + detaildata 1014 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 1015 + return { 1016 + msg: { 1017 + "data": emailstr 1018 + }, 1019 + metadata: metadata, 1020 + msgType: msgType 1021 + }; 1022 +} else if (name == "Low voltage" && status == 1023 + "CLEARED_UNACK") { 1024 + 1025 + var emailstr = 1026 + "<div><p><span style='color: green; font-weight: bold'>Device " + 1027 + label + " Low Voltage Alarm Cleared</span></p>" + 1028 + "<p>-- Current Temperature : " + detaildata.BatV + 1029 + "</p><br><br>" + 1030 + "<p>Device Configure:</p>" + 1031 + "<p>-- Temperature Threshold : min: " + detaildata 1032 + .Low_temperature_alarm + ", max: " + detaildata 1033 + .High_temperature_alarm + "</p>" + 1034 + "<p>-- Humidity Threshold: min: " + detaildata 1035 + .Low_humidity_alarm + ", max:" + detaildata 1036 + .High_humidity_alarm + "</p>" + 1037 + "<p>-- Battery threshold: min: " + detaildata 1038 + .Low_voltage_alarm + "</p>" + str2 + "</div>" 1039 + 1040 + return { 1041 + msg: { 1042 + "data": emailstr 1043 + }, 1044 + metadata: metadata, 1045 + msgType: msgType 1046 + }; 1047 +} else if (name == "Device Disconnected" && status == 1048 + "CLEARED_UNACK") { 1049 + var time1 = locatime(Number(detaildata.lastActivityTime)) 1050 + //var time1 = detaildata.lastActivityTime 1051 + // var chazhi = parseInt((detaildata.inactivityAlarmTime-detaildata.lastActivityTime)/1000/60) 1052 + // var emailstr = 1053 + // "<div><p><span style='color: green; font-weight: bold'>" + 1054 + // "Device " + label + " has Alarm Cleared</span></p><p>Last activity time: "+time1+"</p></div>" 1055 + var emailstr ="Device " + label + " has Alarm Cleared##Last activity time: "+time1 1056 + var newType = "POST_TELEMETRY_REQUEST" 1057 + return { 1058 + msg: emailstr, 1059 + metadata: metadata, 1060 + msgType: newType 1061 + } 1062 +} 1063 +{{/code}} 1064 + 1065 +(% class="wikigeneratedid" %) 1066 +**Generate Report:** 1067 + 1068 +(% class="wikigeneratedid" %) 1069 +[[image:1730865053380-293.png]] 1070 + 1071 += 5.other = 1072 + 1073 +* If you want to create a similar dashboard, after understanding the case, you can download and import the dashboard, device profiles, rule chains, etc. of the case on GitHub, and make modifications based on them. 1074 +* GitHub address:[[https:~~/~~/github.com/ThingsEye-io/te-platform/tree/main/case/Dragino%20Office%20%26%20Factory>>https://github.com/ThingsEye-io/te-platform/tree/main/case/Dragino%20Office%20%26%20Factory]]
- 1730862483514-101.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +195.8 KB - Content
- 1730862584519-902.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +191.1 KB - Content
- 1730863708259-750.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +220.1 KB - Content
- 1730863750414-979.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +210.6 KB - Content
- 1730864045747-876.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +208.9 KB - Content
- 1730864077395-395.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +201.4 KB - Content
- 1730864117808-484.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +203.0 KB - Content
- 1730864159071-895.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +226.6 KB - Content
- 1730864207037-477.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +215.3 KB - Content
- 1730864250506-111.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +209.5 KB - Content
- 1730864293216-991.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +138.5 KB - Content
- 1730864331859-740.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +134.4 KB - Content
- 1730864460314-611.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +256.7 KB - Content
- 1730864617480-221.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +260.8 KB - Content
- 1730864676542-406.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +227.7 KB - Content
- 1730864784118-474.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +148.8 KB - Content
- 1730865053380-293.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +46.7 KB - Content
- 屏幕截图 2024-11-04 135045.png
-
- Author
-
... ... @@ -1,0 +1,1 @@ 1 +XWiki.hera - Size
-
... ... @@ -1,0 +1,1 @@ 1 +29.4 KB - Content