11/08/2019

Axapta : Reports เกินแล้วต้องการลบยอดทิ้ง

Axapta : Reports เกินแล้วต้องการลบยอดทิ้ง
เช่น PD19-019817 : 003016922225 มีการ Reports 1 ตัวเมื่อวันที่ 1/10/2562 ไม่ได้ Pickinglist ทำ Jobcard ยังไม่ได้ Update Costing
ฝผล. ต้องการให้ยกเลิกออก และ ลบ PD ไปเลยเพราะไม่ได้ใช้แล้ว เพราะมีการเปลียน Code ไปทำ PD อื่น แต่ไม่ได้แจ้ง งทส.

ทำได้ 2 วิธี
1. MAA01 ปรับยอดออก และ End PD นั้นไป ควรทำแบบนี้ซึ่งเป็นวิธีที่ถูกต้องและง่ายกว่า
2. ลบและแก้ ไข Transaction ให้เป็นเหมือนว่า PD นี้ไม่ได้ทำขึ้น
วันนี้จะปิด Inventory จึงต้องใช้วิธีที่ 2 ถ้าใช้วิธีที่ 1 ต้องรอทำ MAA01 อนุมัติ (กรณีที่ยังไม่ได้ตัด Pickinglist ถ้าตัด Pickinglist ไปต้องเอายอดกลับคืนมาก่อน และจะใช้วิธีที่ 2 ไม่ได้ เพราะต้องเหลือประวัติว่าของมาจากไหน)
โดย
1. ลบ ข้อมูลออก จาก Inventtrans
2. ลบ ข้อมูลออก จาก InventtransEx
3. Run Job recalcInventSum เพื่อให้ ยอดและมูลค่า Update
4. ลบ Reports ที่ Reports ไปออก ที่ Table ProdJournalProd และ ProdJournalTable
5. ลบ Jobcard ที่ได้ Post ไป ที่ Table ProdJournalRoute และ ProdJournalTable
6. ตรวจสอบรายงาน Stockcard และ รายงาน Inventory ว่าไม่มียอดที่เราลบไป ต้องไม่มีข้อมูล
(สำคัญต้องทำใน Local ก่อน ค่อยทำในของจริง)

10/29/2019

Line Bot : Line แบบ Push สามารถทำเขียน php แล้วเรียกใช้ผ่าน Crontab ก็ได้ Run จาก หน้า php

Line Bot : Line แบบ Push สามารถทำเขียน php แล้วเรียกใช้ผ่าน Crontab ก็ได้ Run จาก หน้า php
ไม่ต้องส่ง reply จาก Line
Test Run ผ่านหน้า Web
หรือ ผ่าน Terminal command php
  1. <?php
  2.  
  3. $ACCESS_TOKEN = "XXX";
  4.  
  5.    $content = file_get_contents('php://input');
  6.    $arrayJson = json_decode($content, true);
  7.    $arrayHeader = array();
  8.    $arrayHeader[] = "Content-Type: application/json";
  9.    $arrayHeader[] = "Authorization: Bearer {$ACCESS_TOKEN}";
  10.    //รับข้อความจากผู้ใช้
  11. //   $message = $arrayJson['events'][0]['message']['text'];
  12.    //รับ id ของผู้ใช้
  13. //   $id = $arrayJson['events'][0]['source']['userId'];
  14. //   #ตัวอย่าง Message Type "Text + Sticker"
  15. //   if($message == "สวัสดี"){
  16.  
  17.       $arrayPostData['to'] = 'UID XXXXX'; //Test Suwit
  18.  
  19.       $arrayPostData['messages'][0]['type'] = "text";
  20.       $arrayPostData['messages'][0]['text'] = "สวัสดีจ้าาา";
  21.  
  22.       $arrayPostData['messages'][1]['type'] = "sticker";
  23.       $arrayPostData['messages'][1]['packageId'] = "2";
  24.       $arrayPostData['messages'][1]['stickerId'] = "34";
  25.       pushMsg($arrayHeader, $arrayPostData);
  26. //   }
  27.  
  28.    function pushMsg($arrayHeader,$arrayPostData){
  29.       $strUrl = "https://api.line.me/v2/bot/message/push";
  30.       $ch = curl_init();
  31.       curl_setopt($ch, CURLOPT_URL,$strUrl);
  32.       curl_setopt($ch, CURLOPT_HEADER, false);
  33.       curl_setopt($ch, CURLOPT_POST, true);
  34.       curl_setopt($ch, CURLOPT_HTTPHEADER, $arrayHeader);
  35.       curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($arrayPostData));
  36.       curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  37.       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  38.       $result = curl_exec($ch);
  39.       curl_close ($ch);
  40.    }
  41. ?>

Line Bot : หา User ID ของ Line เพื่อระบุตัวตนว่า ID Line นี้เป็นของใคร

Line Bot : หา User ID ของ Line เพื่อระบุตัวตนว่า ID Line นี้เป็นของใคร
echo ดูในคำสั่ง bot line หรือ Save To logs แล้วค่อยไปบันทึกเอาก็ได้ จะได้รู้ว่า Line ที่พิมพ์มานี้เป็นของใคร หรือ Group นี้ ID อะไร เป็นต้น Add Bot เข้ากลุ่ม แล้วให้คนอื่นลองพิมพ์ ก็จะได้ ID ของ คนนั้นมาเก็บ
  1. $API_URL = 'https://api.line.me/v2/bot/message';
  2. //###### Token Line Bot Register ######//
  3. $accessToken = "XX";//copy Channel access token ตอนที่ตั้งค่ามาใส่
  4.  
  5. $request = file_get_contents('php://input');   // Get request content
  6. $request_array = json_decode($request, true);   // Decode JSON to Array
  7.  
  8. $arrayHeader = array();
  9. $arrayHeader[] = "Content-Type: application/json";
  10. $arrayHeader[] = "Authorization: Bearer {$accessToken}";
  11.  
  12. //########### Find IDUser IDGroup IDRoom From Source ###############//
  13. if ( sizeof($request_array['events']) > 0 ) {
  14.     foreach ($request_array['events'] as $event) {
  15.         $reply_message = '';
  16.         $reply_token = $event['replyToken'];
  17.  
  18.     if(isset($event['source']['userId'])){
  19.         $id = $event['source']['userId'];
  20.     } else if(isset($event['source']['groupId'])){
  21.         $id = $event['source']['groupId'];
  22.     } else if(isset($event['source']['room'])){
  23.         $id = $event['source']['room'];
  24.     }
  25.  
  26.     $text = $event['message']['text'];
  27.         list($flag, $cmd, $parm1) = explode(' ', $text);
  28.         //###Call Function Save Log ###//
  29.         //saveBotLog($text, $id);
  30.         if($flag == "bot:"){        
  31.             //saveBotLog($text, $id);
  32.             if($cmd == "id"){
  33.                 //$output = getFX();
  34.                 $arrayPostData['replyToken'] = $request_array['events'][0]['replyToken'];
  35.                 $arrayPostData['messages'][0]['type'] = "text";
  36.                 $arrayPostData['messages'][0]['text'] = $id;
  37.                 replyMsg($arrayHeader,$arrayPostData);
  38.            }
  39.            // ###### Not Word bot Not reply ######## //
  40.             if(!empty($output)){    
  41.                 $data = [
  42.                 'replyToken' => $reply_token,
  43.                 'messages' => [['type' => 'text', 'text' => $output ]]
  44.                     ];
  45.                     $post_body = json_encode($data, JSON_UNESCAPED_UNICODE);
  46.                     $send_result = send_reply_message($API_URL.'/reply', $POST_HEADER, $post_body);
  47.                         echo "Result: ".$send_result."\r\n";
  48.             }//Close If empty.
  49.         }//Close If bot.
  50.     }//Close For.
  51. }//Close If.

10/28/2019

PI : Pi Camera Last version with python 3

Old version Use Python2
https://intranet.sci.com/blog.php?u=281&b=1667

PI : Pi Camera Last version with python 3
ที่แตกต่างจาก python2 คือคำสั่ง python จะไม่เหมือนกัน ต้องเขียน Code ใหม่
https://pypi.org/project/slackclient/
เช่น
print
เดิม print ตัวแปร
ใหม่ print (ตัวแปร, " ")

with open ใช้ไม่ได้ Error python io

from slackclient import SlackClient
ต้องเปลี่ยนเป็น
from slack import WebClient

code ส่งข้อความ
เดิม
  1. from slackclient import SlackClient
  2. sc = SlackClient("XXXXXXXXX")
  3. sc.api_call(
  4.    "chat.postMessage",
  5.     channel="CF6GEHBDF",
  6.     text="Hello from Python! camera :tada:"
  7. )

ใหม่
  1. from slack import WebClient
  2. client = WebClient("XXXXXXX")
  3. response = client.chat_postMessage(
  4.    channel='#wifi',
  5.    text="Test")

ใช้เป็น client.chat_postMessage และ client.file_upload เป็นต้น ตามนี้

https://pypi.org/project/slackclient/

วิธีลง ที่เพิ่มขึ้นมาคือ
1. ลง slackclient ด้วยคำสั่ง
  1. pip install slackclient

ไม่ได้จะ Error
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting slackclient
Using cached https://www.piwheels.org/simple/slackcl ... ne-any.whl
slackclient requires Python '>=3.6.0' but the running Python is 2.7.16


ต้อง ลง pip3 สำหรับ python3
1.1. ลง pip3
  1. apt-get install python3-pip

1.2. ลง slackclient
  1. pip3 install slackclient


2. ดู python version ต้องเป็นตัวเดียวกัน
root@raspberrypi:/home/pi/Monitor# python --version
Python 3.7.3
root@raspberrypi:/home/pi/Monitor# python3 --version
Python 3.7.3

ถ้าเป็นแบบนี้จะ run ไม่ได้ หา Module ไม่พบ
root@raspberrypi:/home/pi# python --version
Python 2.7.2
root@raspberrypi:/home/pi# python3 --version
Python 3.7.3


ติดตั้ง python 3.7.0 ตาม Link เพื่อให้เหมือนกัน
https://installvirtual.com/install-python-3-7-on-raspberry-pi/

ทำต่างขั้นสุดท้าย
2.1. แก้ให้โปรแกรม เป็น Default
  1. nano ~/.bashrc

เพิ่ม
alias python='python3'

2.2. run
  1. source ~/.bashrc


ทดลองสร้าง python แล้ว Run คำสั่ง จะสามารถส่ง Slack ได้
(ถ้าไม่ได้ทำข้อ 2 ลองใช้คำสั่ง )
python3 ตามด้วยไฟล์.py ก็ได้เช่นกัน

3. คำสั่งเพิ่มเติม
ดู slackclient version
  1. pip3 list

Update slackclient version
  1. pip3 install slackclient --upgrade


4. เพิ่มเติมใน Motion ไม่ทำงาน ไม่ run คำสั่ง python ที่ไฟล์ motion.conf ถึงจะทำงาน
เดิม ใช้
  1. on_movie_start python /home/pi/slack_post.py

ใหม่ต้องใส่ path ของโปรแกรมด้วย
  1. on_movie_start /usr/bin/python3 /home/pi/slack_post.py

นอกนั้น Set ตามของเดิม
https://intranet.sci.com/blog.php?u=281&b=1667

Code สำเหร็จ
Code สำเร็จ slack_post.py
  1. import glob
  2. import os
  3. import time
  4. import glob
  5.  
  6. from slack import WebClient
  7. client = WebClient("XXXXXXXXX")
  8.  
  9. time.sleep(2)   # Delays for 5 seconds. You can also use a float value.
  10.  
  11. list_of_files = glob.glob('/home/pi/Monitor/*.jpg') # * means all if need specific format then *.csv
  12. latest_file = max(list_of_files, key=os.path.getctime)
  13. #print (latest_file, " ")
  14.  
  15. head, tail = os.path.split(latest_file)
  16. pathName = head+'/'+tail
  17. #with open(latest_file) as file_content:
  18. response = client.files_upload(
  19.    channels="test",
  20.    file=pathName,
  21.    title="Find movement in room IF."
  22.    )
  23.  

Home Assistant : ติดตั้ง Tracking Wifi แจ้งเตือนผ่าน Slack+Mail

Home Assistant : ติดตั้ง Tracking Wifi แจ้งเตือนผ่าน Slack+Mail
IP: 192.168.0.50:8123
1. ติดตั้ง Home Assistant + Mqtt
https://intranet.sci.com/blog.php?u=281&b=1603

** ใช้วง 0 เพราะ Access point TP-Ling TL-WR841ND ไม่รองรับการ Ping ข้าม Subnet คนละวง ทำให้ Track Ping ไม่ติด**

2. สร้าง Device สร้างไฟล์ known_devices.yaml เพื่อให้นำมา Track ได้หลาย Devices เช่น
  1. 19LIB:
  2.   hide_if_away: false
  3.   icon:
  4.   mac:
  5.   name: 19LIB
  6.   picture:
  7.   track: true
  8.   vendor:
  9.   gravatar: suwit@scivalve.com
  10. 20WH:
  11.   hide_if_away: false
  12.   icon:
  13.   mac:
  14.   name: 20WH
  15.   picture:
  16.   track: true
  17.   vendor:
  18.   gravatar: suwit@scivalve.com
  19. 226MN:
  20.   hide_if_away: false
  21.   icon:
  22.   mac:
  23.   name: 226MN
  24.   picture:
  25.   track: true
  26.   vendor:
  27.   gravatar: suwit@scivalve.com


3. แก้ไฟล์ configuration.yaml
  1. #//////////// SCI ADD //////////////////#
  2. # interval_seconds ping every 30 seconds.
  3. # consider_home if ping not reply 300 seconds change status to away. Mark Not Use.
  4. device_tracker:
  5.   - platform: ping
  6.     interval_seconds: 30
  7.     #consider_home: 300
  8.     hosts:
  9.       19LIB: 192.168.0.19
  10.       20WH: 192.168.0.20
  11.       226MN: 192.168.0.226
  12.       223S2: 192.168.0.223
  13.       221PD1: 192.168.0.221
  14.       227PD2: 192.168.0.227
  15.       37QA: 192.168.0.37
  16.       173Test: 192.168.0.173
  17.  
  18. mqtt:
  19.   broker: 127.0.0.1
  20. notify:
  21.   - name: ha_slack
  22.     platform: slack
  23.     api_key: XXXXXXXXXXXXXXXXXXXXXXX Token ID
  24.     default_channel: '#wifi'
  25.  
  26.   - name: "SendMail"
  27.     platform: smtp
  28.     server: smtp.gmail.com
  29.     port: 587
  30.     timeout: 15
  31.     sender: scivalve.suwit@gmail.com
  32.     encryption: starttls
  33.     username: scivalve.suwit@gmail.com
  34.     password: xxxxxxxx
  35.     recipient:
  36.       - suwit.jph@gmail.com
  37.       - komkid@gmail.com
  38.       - seksan.kamt56@gmail.com
  39.     sender_name: Home Assistant Check WIFI


4. สร้าง Automation ส่งเมล์ และ ส่ง Slack เมื่อ Status Wifi ไม่ใช่ Home เช่น
  1. - id: '1569644672332'
  2.   alias: Check_173Test
  3.   trigger:
  4.   - entity_id: device_tracker.173test
  5.     platform: state
  6.   condition:
  7.   - after: '8:00'
  8.     before: '18:00'
  9.     condition: time
  10.   - condition: state
  11.     entity_id: device_tracker.173test
  12.     state: not_home
  13.   action:
  14.   - data:
  15.       message: 'Can''t connect WIFI 192.168.0.173 Test.! : {{ now ().year }}-{{ now
  16.         ().month }}-{{ now ().day }}_{{ now ().hour }}-{{ now ().minute }}-{{ now
  17.         ().second }}'
  18.     service: notify.sendmail
  19.   - data:
  20.       message: 'Can''t connect WIFI 192.168.0.173 Test.! : {{ now ().year }}-{{ now
  21.         ().month }}-{{ now ().day }}_{{ now ().hour }}-{{ now ().minute }}-{{ now
  22.         ().second }}'
  23.       target:
  24.       - '#wifi'
  25.       title: Wifi Loss
  26.     service: notify.ha_slack


5. สร้าง Channel ชื่อ wifi ที่ slack เพิ่ม User และต้อง add app sci-bot ด้วยไม่อย่างนั้นจะส่ง slack มาไม่ผ่าน
https://app.slack.com/client/T03LZ3H08/CNN6QLQ9F/user_profile/UG00D2V5F

Track Multi Device Example:
https://joshmccarty.com/track-homeaway-status-household-using-smart-phones-home-assistant/

https://www.home-assistant.io/components/device_tracker/