หน้าเว็บ

วันอังคารที่ 29 ตุลาคม พ.ศ. 2562

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.

วันจันทร์ที่ 28 ตุลาคม พ.ศ. 2562

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/


Ubuntu : Ubuntu 18.04 Extranet Mount Disk On Qnap Show

****** Not Work ไม่สำเร็จ CIFS VFS ยังขึ้นอยู่ ******

Ubuntu : Ubuntu 18.04 Extranet Mount Disk On Qnap Show CIFS VFS: Free previous auth ในหน้าจอ

Install cifs-utils
  1. sudo apt install cifs-utils


Create credentials file
  1. cat > ~/.smbcredentials

username=myusername
password=mypassword
ctrl+c

  1. sudo chown root ~/.smbcredentials
  2. sudo chmod 600 ~/.smbcredentials


Get UID for plex user account
id -u sa

I'll be using 1000 as the UID for this example
edit fstab file
  1. nano /etc/fstab


Note ip, sharename and username have been changed for privacy. Also vers=3.0 was set because that is the version of samba I have set on my nas.

Old Code
  1. #//192.168.0.218/backup  /BACKUP/BackupToQnap  cifs username=myusername,password=mypassword  0  0
  2. New Cose
  3. //192.168.0.218/backup /BACKUP/BackupToQnap cifs vers=3.0,iocharset=utf8,credentials=/home/sa/.smbcredentials,uid=1000 0 0


Load the new mount point
  1. mount -a


Test reboot จะไม่มีข้อความขึ้นอีก
https://askubuntu.com/questions/1048395/ubuntu-server-18-04-lts-getting-cifs-vfs-free-previous-auth-key-response

Axapta Code recalcInventSum

Axapta Code recalcInventSum
static void recalcInventSum(Args _args)
{

    ItemId                  myItemId = "024020326229";
    InventSumRecalcItem     inventSumRecalcItem;
    ;

    inventSumRecalcItem = new InventSumRecalcItem(myItemId, true, CheckFix::Fix);
    inventSumRecalcItem.updatenow();
}

Axapta : Axapta End คำสั่งผลิตไม่ได้ เนื่องจากมี Reports ติดลบ

Axapta : Axapta End คำสั่งผลิตไม่ได้ เนื่องจากมี Reports ติดลบ
****** สำคัญต่อไปไม่ควร Reports ติดลบเพราะจะทำให้คำสั่งผลิตมีปัญหา ต้องใช้ MAA01 ปรับยอดออกเอา ************

PD19-013628 : 024020326229 ทำ Reports ติดลบในเดือน 9 จะ End คำสั่งผลิตในเดือน 10 ทำไม่ได้
Error
Production cannot be post-adjusted.

*** แก้ PD แก้ Transaction แล้ว Update มีปัญหา Stockcard Onhand ไม่ตรง ***

จึงต้องแก้โดย ลบ Transaction ทิ้ง เหมือนไม่ได้ทำการ Reports ให้เหลือ Reports เดือนปัจจุบันที่จะเอาไว้ตามจริง
ที่ต้องทำ
1. ลบ Transaction ที่ InventTrans ที่ PD นั้น + และ - ขึ้นมา ออก 2 รายการ

2. ลบ Reports ทั้งใน Line และ เล่มที่ Reports ขึ้นมา ใน Table ProdJournalProd และ ProdJournalTable

3. ลบจำนวน Costing ที่ Table ProdTableJour ถ้าไม่ลบจำนวน Costing จะเกิน
4. Run Job : recalcInventSum Update


5. Update คำสั่งผลิต และติ๊ก End คำสั่งผลิต ที่มีปัญหา จะ End ได้ (ใส่ Remark ไว้ใน PD ด้วยก่อน End ว่าเกิดอะไรขึ้น)
6. ดู Onhand เรียกรายงาน Inventory และ Stockcard มีอะไรผิดปกติหรือไม่ ดูว่ายอดตรงกับที่ควรจะเป็นหรือไม่
ยอด Onhand , Stockcard , Inventory คงเหลือต้องเท่ากัน