• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

Module Sending notification to a python project

Scheduled Pinned Locked Moved Solved Requests
12 Posts 2 Posters 5.0k Views 2 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    idoodler Module Developer @bimbim2401
    last edited by May 31, 2018, 3:34 PM

    @bimbim2401 Well, in Chrome I can see. That the MagicMirror Webclient establishes a Websocket connection to ws://IP:8080/socket.io/?EIO=3&transport=websocket&sid=SOME_ID. You can clearly see the communication, as the communication is not encrypted at all.

    1 Reply Last reply Reply Quote 0
    • B Offline
      bimbim2401
      last edited by bimbim2401 May 31, 2018, 4:13 PM May 31, 2018, 4:13 PM

      Thanks both for your response

      Do you think that the python code I have wrote is ok or can you give me the direction for the python code for listening to the notification

      I 1 Reply Last reply May 31, 2018, 5:36 PM Reply Quote 0
      • I Offline
        idoodler Module Developer @bimbim2401
        last edited by May 31, 2018, 5:36 PM

        @bimbim2401 Well, my Python times are a long time ago. Just try to run this script ans log the output. I also highly recogmend you to open Chrome and look at the Websocket frames.

        1 Reply Last reply Reply Quote 0
        • B Offline
          bimbim2401
          last edited by May 31, 2018, 9:31 PM

          F12 and then network ? Right ?

          I 1 Reply Last reply Jun 1, 2018, 7:23 AM Reply Quote 0
          • I Offline
            idoodler Module Developer @bimbim2401
            last edited by idoodler Jun 1, 2018, 7:24 AM Jun 1, 2018, 7:23 AM

            @bimbim2401 Yep, on Windows its F12, on macOS its alt + cmd + i.

            • Open the Network-Tab
            • Look for the status code 101 (Switching Protocols) or just look for the type websocket
            • Open the request
            • Inspect the Socket as you wish (View frames, headers…)
            1 Reply Last reply Reply Quote 0
            • B Offline
              bimbim2401
              last edited by bimbim2401 Jun 2, 2018, 1:52 PM Jun 2, 2018, 1:38 PM

              Sorry but i cannot succeed to launch multiple script i found to intercept the get request from the module in python.

              i need some help … sorry this is my first program in python language

              Here is the script i want to modify : https://github.com/shivasiddharth/GassistPi/blob/master/src/main.py

              I 1 Reply Last reply Jun 2, 2018, 2:03 PM Reply Quote 0
              • I Offline
                idoodler Module Developer @bimbim2401
                last edited by Jun 2, 2018, 2:03 PM

                @bimbim2401 I am not a Python guy either. Start small, create a simple Python script that establishes a Websocket connection, then interprete the websocket messages and so on…

                1 Reply Last reply Reply Quote 0
                • B Offline
                  bimbim2401
                  last edited by bimbim2401 Jun 4, 2018, 10:11 AM Jun 4, 2018, 9:52 AM

                  Hey,

                  i have succeed to make it works with the following in the main.py, my problem was due to the port which was already in use, and then i have to take another one.

                  add the import

                  from threading import Thread
                  from urllib.parse import unquote
                  

                  then just before the main function add

                  class WebSocketsListener(Thread):
                  """Thread chargé d'ecouter les messages sur la websocket."""
                  
                  def __init__(self, assistant):
                      Thread.__init__(self)
                      self.websocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                      self.websocket.bind(('127.0.0.1', 8081))
                      self.assistant = assistant
                  
                  
                  def run(self):
                      print ("Open socket")
                  
                      while True:
                          self.websocket.listen(5)
                          client, address = self.websocket.accept()
                          print (format( address ))
                  
                          response = client.recv(255)
                          if response != "":
                              print (response)
                              str_response = response.decode("utf-8")
                              if 'assistant' in str_response:
                                  
                                  if 'mode' in str_response:
                                      if 'start' in str_response:
                                          print("start the assistant") 
                                          self.assistant.start_conversation()
                                      if 'stop' in str_response: 
                                          print("stop  the assistant") 
                                          self.assistant.stop_conversation()
                  
                                  elif 'say' in str_response:
                                      token = str_response[str_response.find("say=")+4:str_response.find("HTTP")-1]
                                      token = unquote(token)
                                      say(token)
                  
                      print ("Close socket")
                      client.close()
                      stock.close()
                  

                  in the main function just before the for event in events

                      webSocketsListener = WebSocketsListener(assistant)
                      webSocketsListener.start()
                  

                  With this, open a web browser and write
                  http://127.0.0.1:8081/assistant?mode=start
                  it will start manually the assistant like with the hotword"ok google"
                  http://127.0.0.1:8081/assistant?mode=stop
                  to stop the assistant if the conversation is too long
                  http://127.0.0.1:8081/assistant?say=Hello karim how are you
                  and then gassistPI will say what you write

                  in the magic mirror module, you have to send this request in the node helper.js

                   socketNotificationReceived: function(notification, payload) {
                  
                      var res = "";
                      var ipadress = "127.0.0.1";
                      var port = "8081";
                  
                  
                  console.log("google assistant Node Helper Received a socket notification: " + notification + " payload:" + payload);
                  if (notification === "ASSISTANT_START"){
                  	request("http://"+ipadress+":"+port+"/assistant?mode=start", { json: true }, (err, res, body) => {
                  		if (err) { return console.log(err); }
                  		console.log(body.url);
                  		console.log(body.explanation);
                  	});
                  }
                  else if (notification === "ASSISTANT_STOP"){
                  	request("http://"+ipadress+":"+port+"/assistant?mode=stop", { json: true }, (err, res, body) => {
                  		if (err) { return console.log(err); }
                  		console.log(body.url);
                  		console.log(body.explanation);
                  	});
                  	
                  }
                  else if (notification === "ASSISTANT_SAY"){
                  	console.log("assistant payload:"+payload);
                  	request("http://"+ipadress+":"+port+"/assistant?say="+payload, { json: true }, (err, res, body) => {
                  		if (err) { return console.log(err); }
                  		console.log(body.url);
                  		console.log(body.explanation);
                  	});
                  }		
                  }	
                  

                  Thanks for your help

                  I 1 Reply Last reply Jun 4, 2018, 11:30 AM Reply Quote 1
                  • I Offline
                    idoodler Module Developer @bimbim2401
                    last edited by Jun 4, 2018, 11:30 AM

                    @bimbim2401 Congratulations!

                    1 Reply Last reply Reply Quote 0
                    • 1
                    • 2
                    • 2 / 2
                    2 / 2
                    • First post
                      8/12
                      Last post
                    Enjoying MagicMirror? Please consider a donation!
                    MagicMirror created by Michael Teeuw.
                    Forum managed by Sam, technical setup by Karsten.
                    This forum is using NodeBB as its core | Contributors
                    Contact | Privacy Policy