<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://communities.bentley.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Receive instant notifications for finished calculations on your phone</title><link>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone</link><description /><dc:language>en-US</dc:language><generator>Telligent Community 12</generator><item><title>Receive instant notifications for finished calculations on your phone</title><link>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone</link><pubDate>Tue, 15 Feb 2022 11:11:01 GMT</pubDate><guid isPermaLink="false">6dad98f5-dbc9-4c4d-a9ba-e9da8dc6aa8e:43f5bec0-d8e1-4cb9-8d8b-771ac20ed60d</guid><dc:creator>Stefanos Papavasileiou</dc:creator><comments>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone#comments</comments><description>Current Revision posted to GeoStudio | PLAXIS Wiki by Stefanos Papavasileiou on 2/15/2022 11:11:01 AM&lt;br /&gt;
&lt;div class="content-scrollable-wrapper" style="overflow:auto;border-collapse:collapse;padding-bottom:30px;"&gt;
&lt;table border="0" style="width:500px;background-color:#fffff;border:rgb(86, 170, 28) 0px solid;border-width:1px 0px 0px 0px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;PLAXIS 2D&lt;br /&gt;PLAXIS 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;PLAXIS 2D&lt;br /&gt;PLAXIS 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Date created&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;29 April 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Date modified&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;29 April 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;tbody&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;!--–– end of Bentley header ––--&gt;
&lt;p&gt;When running long calculations using PLAXIS, it would be great if you can receive instant notifications when this calculation is finished: either via e-mail or a (push) notification on your smartphone (e.g. iPhone or Android device). This could be very useful for calculations that run unattended for example during a meeting, during lunch break or after office hours.&lt;br /&gt;With the implementation of the PLAXIS Remote Scripting / HTTP REST API, this is now possible: once a calculation is finished you can be notified instantly!&lt;/p&gt;
&lt;h2&gt;First step: Message composition&lt;/h2&gt;
&lt;p&gt;Any method that we will use below will first need to calculate the PLAXIS project and gather the results for a short overview of the calculation result.&lt;/p&gt;
&lt;p&gt;First, we need to have the model loaded into PLAXIS and PLAXIS needs to be run as a Remote Scripting server. The PLAXIS Remote Scripting server within PLAXIS 2D or PLAXIS 3D can be activated via the menu item&lt;em&gt; Expert &amp;gt; Configure remote Scripting server&lt;/em&gt;.&lt;br /&gt;See also the related page on &lt;em&gt;&lt;strong&gt;Using PLAXIS Remote scripting with the Python wrapper&lt;/strong&gt;&lt;/em&gt; at the bottom of the page.&lt;/p&gt;
&lt;p&gt;Next step is to use Python scripting to start the calculation, after which we can collect the results:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;check for each phase if the calculation was successful or not&lt;/li&gt;&lt;li&gt;Optional, when desired we can get main characteristics for a calculation type, like the reached value of &lt;em&gt;SumMsf&lt;/em&gt; for a Safety calculation (i.e. the Factor of Safety)&lt;/li&gt;&lt;li&gt;And determine a summary for the notification&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Here we can write a function that gathers the basic phase information: was it calculated, and was it calculated successful or did it fail:&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;gather_phase_overview&lt;/span&gt;(): 
    results &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; [] 
    allpassed &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt; 
    &lt;span style="color:#ff5600;"&gt;for&lt;/span&gt; phase &lt;span style="color:#ff5600;"&gt;in&lt;/span&gt; g_i.Phases[:]: 
        msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;not calculated&amp;quot;&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;not&lt;/span&gt; phase.ShouldCalculate: 
            &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; phase.CalculationResult &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; phase.CalculationResult.ok: 
                msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt; &lt;span style="color:#919191;"&gt;# may be extended for more details &lt;/span&gt;
            &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
                msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Failed: error {0}&amp;quot;&lt;/span&gt;.format(phase.LogInfo) 
                allpassed &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        results.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/span&gt;.format( phase.Name, msg)) 
     &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; allpassed, results
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This can be used to create message data with a subject/summary and a detailed message (the body):&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;get_message_info&lt;/span&gt;(): 
    message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; {&lt;span style="color:#00a33f;"&gt;&amp;quot;Subject&amp;quot;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color:#00a33f;"&gt;&amp;quot;Body&amp;quot;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;} 
    allpassed, results &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; gather_phase_overview() 
    &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; allpassed &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt;: 
        message[&lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Calculation OK&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
        message[&lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Calculation failed&amp;quot;&lt;/span&gt; 
    body &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; [&lt;span style="color: #00a33f;"&gt;"Summary for PLAXIS calculation"&lt;/span&gt;] 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;Title: {0}&amp;quot;&lt;/span&gt;.format(g_i.Project.Title)) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;File: {0}&amp;quot;&lt;/span&gt;.format(g_i.Project.Filename)) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;Phase results:&amp;#39;&lt;/span&gt;) 
    &lt;span style="color:#ff5600;"&gt;for&lt;/span&gt; result &lt;span style="color:#ff5600;"&gt;in&lt;/span&gt; results: 
        body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;- {0}&amp;#39;&lt;/span&gt;.format(result)) 
    message[&lt;span style="color: #00a33f;"&gt;"Body"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;.join(body) 
    &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; message
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;E-mail notification&lt;/h2&gt;
&lt;p&gt;With Python, it is possible to send e-mail messages, e.g. by using the SMTP protocol via the &lt;em&gt;smtplib&lt;/em&gt; module, but of course, more methods are available. For a detailed example, please refer to:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;the Python sample on Sending an email using Gmail in the PLAXIS Reference manual Appendix on Python HTTP REST API wrapper.&lt;/li&gt;&lt;li&gt;this example is based on this Python code example: &lt;a href="http://segfault.in/2010/12/sending-gmail-from-python/" rel="noopener noreferrer" target="_blank"&gt;http://segfault.in/2010/12/sending-gmail-from-python/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Push notifications on smart devices&lt;/h2&gt;
&lt;p&gt;Using third party services/apps it is possible to get push messages/notifications on smart devices like iPhones or Android devices. Two of such services are for example:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;BoxCar: &lt;a href="https://boxcar.io/" rel="noopener noreferrer" target="_blank"&gt;https://boxcar.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PushOver: &lt;a href="https://pushover.net/" rel="noopener noreferrer" target="_blank"&gt;https://pushover.net/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Such services have apps available for e.g. iOS and Android. Using the service&amp;#39;s API it is possible to send a self-made notification to these apps on your smartphone.&lt;/p&gt;
&lt;h3&gt;Example: Notifications for iPhone using BoxCar&lt;/h3&gt;
&lt;p&gt;Below we have a sample code to send a message using BoxCar. Documentation on how to send a notification to BoxCar:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-a-notification-to-boxcar-for-ios-users"&gt;http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-...&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Note: to be able to use the Boxcar end-user API, you need your &amp;quot;Access Token&amp;quot;. The access token is available from the general &amp;quot;Settings&amp;quot; screen of Boxcar or from the &lt;a href="https://new.boxcar.io/account/edit" rel="noopener noreferrer" target="_blank"&gt;Boxcar Web Inbox&lt;/a&gt; setting page.&lt;br /&gt;Also, we will use the &lt;em&gt;&lt;strong&gt;requests &lt;/strong&gt;&lt;/em&gt;module, which is not a standard Python module: it is available via &lt;a href="https://pypi.python.org/pypi/requests" rel="noopener noreferrer" target="_blank"&gt;https://pypi.python.org/pypi/requests&lt;/a&gt; (requires to install) and it is also available as part of the Plaxis scripting environment.&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; requests &lt;span style="color:#919191;"&gt;# available at https://pypi.python.org/pypi/requests &lt;/span&gt;
&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; json 
&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; time

&lt;span style="color:#ff5600;"&gt;class&lt;/span&gt; &lt;span style="color:#21439c;"&gt;BoxCar&lt;/span&gt;: 
    BASE_URL &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;https://new.boxcar.io/api/&amp;quot;&lt;/span&gt; 
    RETRY_ATTEMPTS &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 3 
    RETRY_SLEEP &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 2 
    SOUND &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;done&amp;#39;&lt;/span&gt; 
    ICON &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;https://www.plaxis.com/content/uploads/2016/11/plaxis_64.png&amp;#39;&lt;/span&gt; 
    
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;&lt;span style="color:#a535ae;"&gt;__init__&lt;/span&gt;&lt;/span&gt;(self, access_token): 
        self.access_token &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; access_token 
        self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        self.encoded_data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;None&lt;/span&gt; 
        self.sound&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;self.SOUND
 
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;notify&lt;/span&gt;(self, title, message): 
        attempts &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 0 
        &lt;span style="color:#ff5600;"&gt;while&lt;/span&gt; attempts &lt;span style="color:#ff5600;"&gt;&amp;lt;&lt;/span&gt; self.RETRY_ATTEMPTS: 
            attempts &lt;span style="color:#ff5600;"&gt;+=&lt;/span&gt; 1 
            result &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; self._send_notification(title, message) 
            &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; result.status_code &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; 201: 
                &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;* Message: %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; title ) 
                &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;* Message delivered @ %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; result.headers[&lt;span style="color: #00a33f;"&gt;'date'&lt;/span&gt;]) 
                self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt; 
                &lt;span style="color:#ff5600;"&gt;break&lt;/span&gt; 
            &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
                &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; attempts &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; self.RETRY_ATTEMPTS: 
                    &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;! Message delivery FAILED: %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; ( result )) 
                    &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;!   %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; result.status_code) 
                self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; self.success
 
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;_send_notification&lt;/span&gt;(self, title, long_message ): 
        &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&amp;#39; Documentation on how to send a notification to BoxCar: 
            http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-a-notification-to-boxcar-for-ios-users
        &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;#39;Sending a notification via BoxCar...&amp;#39;&lt;/span&gt;) 
        long_message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; long_message.replace( &lt;span style="color:#00a33f;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;, &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;lt;br /&amp;gt;&amp;#39;&lt;/span&gt;) 
        data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; { &lt;span style="color:#00a33f;"&gt;&amp;#39;user_credentials&amp;#39;&lt;/span&gt;: self.access_token, 
                 &lt;span style="color:#00a33f;"&gt;&amp;#39;notification&amp;#39;&lt;/span&gt;: { 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;PLAXIS: {0}&amp;quot;&lt;/span&gt;.format(title), 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;long_message&amp;#39;&lt;/span&gt;: long_message, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;sound&amp;#39;&lt;/span&gt;: self.sound, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;icon_url&amp;#39;&lt;/span&gt;: self.ICON, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;source_name&amp;#39;&lt;/span&gt; : &lt;span style="color:#00a33f;"&gt;&amp;#39;PLAXIS&amp;#39;&lt;/span&gt; 
                     } 
                }  
        notifications_url &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; self.BASE_URL &lt;span style="color:#ff5600;"&gt;+&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;notifications&amp;quot;&lt;/span&gt; 
        headers &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; {&lt;span style="color:#00a33f;"&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;, 
                                   &lt;span style="color:#00a33f;"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;} 
        self.encoded_data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; json.dumps(data, ensure_ascii&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;&lt;span style="color:#a535ae;"&gt;False&lt;/span&gt;).encode(&lt;span style="color:#00a33f;"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;) 
        _request &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; requests.post(notifications_url, 
                                 data&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;self.encoded_data, 
                                 headers&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;headers ) 
        &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; _request
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can combine it to send a message. For this, you will need your BoxCar token. The access token is available from the general &amp;quot;Settings&amp;quot; screen of Boxcar or from  Boxcar Web Inbox setting page.&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;g_i.calculate() 
&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;sendmessage&lt;/span&gt;(): 
    message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; get_message_info() 
    boxcartoken &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style="color:#919191;"&gt;# YOUR BOXCAR TOKEN HERE! &lt;/span&gt;
    push &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; BoxCar(boxcartoken) 
    push.notify(message[ &lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt; ], message[ &lt;span style="color: #00a33f;"&gt;"Body"&lt;/span&gt; ]) 
sendmessage()
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the push message on e.g. an iPhone will look like this:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;em&gt;&lt;span class="styles file-styles large" id="styles-9-0"&gt; &lt;img class="media-image" id="1" src="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-05-58/python_5F00_notify_5F00_boxcar_5F00_iphone6_5F00_2_5F00_images.png" alt=" " /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;em&gt;Figure 1. Notifications using BoxCar 2: left lock screen push message and on the right the detailed message&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Using the power of &lt;strong&gt;Plaxis Remote Scripting&lt;/strong&gt; it is possible to get instant notifications about your PLAXIS calculations on your mobile devices!&lt;/p&gt;
&lt;div&gt;
&lt;h4&gt;See also&lt;/h4&gt;
&lt;div id="plxrelated" style="padding-left:20px;"&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://communities.bentley.com/products/geotechnical1/w/wiki/45454/identify-python-commands-from-plaxis-command-line" style="font-size:110%;"&gt;Identify Python commands from Plaxis command line&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Python Scripts]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr style="width:98%;border:1px solid rgb(86, 170, 28);" /&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://communities.bentley.com/products/geotechnical1/w/wiki/46005/using-plaxis-remote-scripting-with-the-python-wrapper" style="font-size:110%;"&gt;Using PLAXIS Remote scripting with the Python wrapper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Tips and Tricks]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr style="width:98%;border:1px solid rgb(86, 170, 28);" /&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://communities.bentley.com/products/geotechnical1/w/wiki/45880/remote-scripting-api-drivemining" style="font-size:110%;"&gt;Remote Scripting API: Drivemining&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Videos]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Rest Http, PLAXIS 3D, python, API, py cookbook, push, Android, iPhone, mobile, PLAXIS, Remote scripting, cookbook, python cookbook, ios, Notifications, PLAXIS 2D&lt;/div&gt;
</description></item><item><title>Receive instant notifications for finished calculations on your phone</title><link>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone/revision/2</link><pubDate>Tue, 24 Dec 2019 11:16:50 GMT</pubDate><guid isPermaLink="false">6dad98f5-dbc9-4c4d-a9ba-e9da8dc6aa8e:43f5bec0-d8e1-4cb9-8d8b-771ac20ed60d</guid><dc:creator>Micha van der Sloot</dc:creator><comments>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone#comments</comments><description>Revision 2 posted to GeoStudio | PLAXIS Wiki by Micha van der Sloot on 12/24/2019 11:16:50 AM&lt;br /&gt;
&lt;div class="content-scrollable-wrapper" style="overflow:auto;border-collapse:collapse;padding-bottom:30px;"&gt;
&lt;table border="0" style="width:500px;background-color:#fffff;border:rgb(86, 170, 28) 0px solid;border-width:1px 0px 0px 0px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;PLAXIS 2D&lt;br /&gt;PLAXIS 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;PLAXIS 2D&lt;br /&gt;PLAXIS 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Date created&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;29 April 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Date modified&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;29 April 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;tbody&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;!--–– end of Bentley header ––--&gt;
&lt;p&gt;When running long calculations using PLAXIS, it would be great if you can receive instant notifications when this calculation is finished: either via e-mail or a (push) notification on your smartphone (e.g. iPhone or Android device). This could be very useful for calculations that run unattended for example during a meeting, during lunch break or after office hours.&lt;br /&gt;With the implementation of the PLAXIS Remote Scripting / HTTP REST API, this is now possible: once a calculation is finished you can be notified instantly!&lt;/p&gt;
&lt;h2&gt;First step: Message composition&lt;/h2&gt;
&lt;p&gt;Any method that we will use below will first need to calculate the PLAXIS project and gather the results for a short overview of the calculation result.&lt;/p&gt;
&lt;p&gt;First, we need to have the model loaded into PLAXIS and PLAXIS needs to be run as a Remote Scripting server. The PLAXIS Remote Scripting server within PLAXIS 2D or PLAXIS 3D can be activated via the menu item&lt;em&gt; Expert &amp;gt; Configure remote Scripting server&lt;/em&gt;.&lt;br /&gt;See also the related page on &lt;em&gt;&lt;strong&gt;Using PLAXIS Remote scripting with the Python wrapper&lt;/strong&gt;&lt;/em&gt; at the bottom of the page.&lt;/p&gt;
&lt;p&gt;Next step is to use Python scripting to start the calculation, after which we can collect the results:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;check for each phase if the calculation was successful or not&lt;/li&gt;&lt;li&gt;Optional, when desired we can get main characteristics for a calculation type, like the reached value of &lt;em&gt;SumMsf&lt;/em&gt; for a Safety calculation (i.e. the Factor of Safety)&lt;/li&gt;&lt;li&gt;And determine a summary for the notification&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Here we can write a function that gathers the basic phase information: was it calculated, and was it calculated successful or did it fail:&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;gather_phase_overview&lt;/span&gt;(): 
    results &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; [] 
    allpassed &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt; 
    &lt;span style="color:#ff5600;"&gt;for&lt;/span&gt; phase &lt;span style="color:#ff5600;"&gt;in&lt;/span&gt; g_i.Phases[:]: 
        msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;not calculated&amp;quot;&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;not&lt;/span&gt; phase.ShouldCalculate: 
            &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; phase.CalculationResult &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; phase.CalculationResult.ok: 
                msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt; &lt;span style="color:#919191;"&gt;# may be extended for more details &lt;/span&gt;
            &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
                msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Failed: error {0}&amp;quot;&lt;/span&gt;.format(phase.LogInfo) 
                allpassed &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        results.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/span&gt;.format( phase.Name, msg)) 
     &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; allpassed, results
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This can be used to create message data with a subject/summary and a detailed message (the body):&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;get_message_info&lt;/span&gt;(): 
    message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; {&lt;span style="color:#00a33f;"&gt;&amp;quot;Subject&amp;quot;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color:#00a33f;"&gt;&amp;quot;Body&amp;quot;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;} 
    allpassed, results &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; gather_phase_overview() 
    &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; allpassed &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt;: 
        message[&lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Calculation OK&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
        message[&lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Calculation failed&amp;quot;&lt;/span&gt; 
    body &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; [&lt;span style="color: #00a33f;"&gt;"Summary for PLAXIS calculation"&lt;/span&gt;] 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;Title: {0}&amp;quot;&lt;/span&gt;.format(g_i.Project.Title)) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;File: {0}&amp;quot;&lt;/span&gt;.format(g_i.Project.Filename)) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;Phase results:&amp;#39;&lt;/span&gt;) 
    &lt;span style="color:#ff5600;"&gt;for&lt;/span&gt; result &lt;span style="color:#ff5600;"&gt;in&lt;/span&gt; results: 
        body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;- {0}&amp;#39;&lt;/span&gt;.format(result)) 
    message[&lt;span style="color: #00a33f;"&gt;"Body"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;.join(body) 
    &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; message
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;E-mail notification&lt;/h2&gt;
&lt;p&gt;With Python, it is possible to send e-mail messages, e.g. by using the SMTP protocol via the &lt;em&gt;smtplib&lt;/em&gt; module, but of course, more methods are available. For a detailed example, please refer to:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;the Python sample on Sending an email using Gmail in the PLAXIS Reference manual Appendix on Python HTTP REST API wrapper.&lt;/li&gt;&lt;li&gt;this example is based on this Python code example: &lt;a href="http://segfault.in/2010/12/sending-gmail-from-python/" rel="noopener noreferrer" target="_blank"&gt;http://segfault.in/2010/12/sending-gmail-from-python/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Push notifications on smart devices&lt;/h2&gt;
&lt;p&gt;Using third party services/apps it is possible to get push messages/notifications on smart devices like iPhones or Android devices. Two of such services are for example:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;BoxCar: &lt;a href="https://boxcar.io/" rel="noopener noreferrer" target="_blank"&gt;https://boxcar.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PushOver: &lt;a href="https://pushover.net/" rel="noopener noreferrer" target="_blank"&gt;https://pushover.net/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Such services have apps available for e.g. iOS and Android. Using the service&amp;#39;s API it is possible to send a self-made notification to these apps on your smartphone.&lt;/p&gt;
&lt;h3&gt;Example: Notifications for iPhone using BoxCar&lt;/h3&gt;
&lt;p&gt;Below we have a sample code to send a message using BoxCar. Documentation on how to send a notification to BoxCar:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-a-notification-to-boxcar-for-ios-users"&gt;http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-...&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Note: to be able to use the Boxcar end-user API, you need your &amp;quot;Access Token&amp;quot;. The access token is available from the general &amp;quot;Settings&amp;quot; screen of Boxcar or from the &lt;a href="https://new.boxcar.io/account/edit" rel="noopener noreferrer" target="_blank"&gt;Boxcar Web Inbox&lt;/a&gt; setting page.&lt;br /&gt;Also, we will use the &lt;em&gt;&lt;strong&gt;requests &lt;/strong&gt;&lt;/em&gt;module, which is not a standard Python module: it is available via &lt;a href="https://pypi.python.org/pypi/requests" rel="noopener noreferrer" target="_blank"&gt;https://pypi.python.org/pypi/requests&lt;/a&gt; (requires to install) and it is also available as part of the Plaxis scripting environment.&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; requests &lt;span style="color:#919191;"&gt;# available at https://pypi.python.org/pypi/requests &lt;/span&gt;
&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; json 
&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; time

&lt;span style="color:#ff5600;"&gt;class&lt;/span&gt; &lt;span style="color:#21439c;"&gt;BoxCar&lt;/span&gt;: 
    BASE_URL &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;https://new.boxcar.io/api/&amp;quot;&lt;/span&gt; 
    RETRY_ATTEMPTS &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 3 
    RETRY_SLEEP &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 2 
    SOUND &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;done&amp;#39;&lt;/span&gt; 
    ICON &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;https://www.plaxis.com/content/uploads/2016/11/plaxis_64.png&amp;#39;&lt;/span&gt; 
    
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;&lt;span style="color:#a535ae;"&gt;__init__&lt;/span&gt;&lt;/span&gt;(self, access_token): 
        self.access_token &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; access_token 
        self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        self.encoded_data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;None&lt;/span&gt; 
        self.sound&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;self.SOUND
 
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;notify&lt;/span&gt;(self, title, message): 
        attempts &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 0 
        &lt;span style="color:#ff5600;"&gt;while&lt;/span&gt; attempts &lt;span style="color:#ff5600;"&gt;&amp;lt;&lt;/span&gt; self.RETRY_ATTEMPTS: 
            attempts &lt;span style="color:#ff5600;"&gt;+=&lt;/span&gt; 1 
            result &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; self._send_notification(title, message) 
            &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; result.status_code &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; 201: 
                &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;* Message: %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; title ) 
                &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;* Message delivered @ %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; result.headers[&lt;span style="color: #00a33f;"&gt;'date'&lt;/span&gt;]) 
                self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt; 
                &lt;span style="color:#ff5600;"&gt;break&lt;/span&gt; 
            &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
                &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; attempts &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; self.RETRY_ATTEMPTS: 
                    &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;! Message delivery FAILED: %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; ( result )) 
                    &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;!   %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; result.status_code) 
                self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; self.success
 
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;_send_notification&lt;/span&gt;(self, title, long_message ): 
        &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&amp;#39; Documentation on how to send a notification to BoxCar: 
            http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-a-notification-to-boxcar-for-ios-users
        &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;#39;Sending a notification via BoxCar...&amp;#39;&lt;/span&gt;) 
        long_message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; long_message.replace( &lt;span style="color:#00a33f;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;, &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;lt;br /&amp;gt;&amp;#39;&lt;/span&gt;) 
        data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; { &lt;span style="color:#00a33f;"&gt;&amp;#39;user_credentials&amp;#39;&lt;/span&gt;: self.access_token, 
                 &lt;span style="color:#00a33f;"&gt;&amp;#39;notification&amp;#39;&lt;/span&gt;: { 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;PLAXIS: {0}&amp;quot;&lt;/span&gt;.format(title), 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;long_message&amp;#39;&lt;/span&gt;: long_message, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;sound&amp;#39;&lt;/span&gt;: self.sound, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;icon_url&amp;#39;&lt;/span&gt;: self.ICON, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;source_name&amp;#39;&lt;/span&gt; : &lt;span style="color:#00a33f;"&gt;&amp;#39;PLAXIS&amp;#39;&lt;/span&gt; 
                     } 
                }  
        notifications_url &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; self.BASE_URL &lt;span style="color:#ff5600;"&gt;+&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;notifications&amp;quot;&lt;/span&gt; 
        headers &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; {&lt;span style="color:#00a33f;"&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;, 
                                   &lt;span style="color:#00a33f;"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;} 
        self.encoded_data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; json.dumps(data, ensure_ascii&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;&lt;span style="color:#a535ae;"&gt;False&lt;/span&gt;).encode(&lt;span style="color:#00a33f;"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;) 
        _request &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; requests.post(notifications_url, 
                                 data&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;self.encoded_data, 
                                 headers&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;headers ) 
        &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; _request
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can combine it to send a message. For this, you will need your BoxCar token. The access token is available from the general &amp;quot;Settings&amp;quot; screen of Boxcar or from  Boxcar Web Inbox setting page.&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;g_i.calculate() 
&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;sendmessage&lt;/span&gt;(): 
    message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; get_message_info() 
    boxcartoken &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style="color:#919191;"&gt;# YOUR BOXCAR TOKEN HERE! &lt;/span&gt;
    push &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; BoxCar(boxcartoken) 
    push.notify(message[ &lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt; ], message[ &lt;span style="color: #00a33f;"&gt;"Body"&lt;/span&gt; ]) 
sendmessage()
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the push message on e.g. an iPhone will look like this:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;em&gt;&lt;span class="styles file-styles large" id="styles-9-0"&gt; &lt;img class="media-image" id="1" src="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-01-05/python_5F00_notify_5F00_boxcar_5F00_iphone6_5F00_2_5F00_images.png" alt=" " /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;em&gt;Figure 1. Notifications using BoxCar 2: left lock screen push message and on the right the detailed message&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Using the power of &lt;strong&gt;Plaxis Remote Scripting&lt;/strong&gt; it is possible to get instant notifications about your PLAXIS calculations on your mobile devices!&lt;/p&gt;
&lt;div&gt;
&lt;h4&gt;See also&lt;/h4&gt;
&lt;div id="plxrelated" style="padding-left:20px;"&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://communities.bentley.com/products/geotechnical1/w/wiki/45454/identify-python-commands-from-plaxis-command-line" style="font-size:110%;"&gt;Identify Python commands from Plaxis command line&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Python Scripts]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr style="width:98%;border:1px solid rgb(86, 170, 28);" /&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://communities.bentley.com/products/geotechnical1/w/wiki/46005/using-plaxis-remote-scripting-with-the-python-wrapper" style="font-size:110%;"&gt;Using PLAXIS Remote scripting with the Python wrapper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Tips and Tricks]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr style="width:98%;border:1px solid rgb(86, 170, 28);" /&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://communities.bentley.com/products/geotechnical1/w/wiki/45880/remote-scripting-api-drivemining" style="font-size:110%;"&gt;Remote Scripting API: Drivemining&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Videos]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Rest Http, Plaxis 3D, python, API, py cookbook, push, Android, iPhone, mobile, PLAXIS, Remote scripting, cookbook, python cookbook, ios, Notifications, PLAXIS 2D&lt;/div&gt;
</description></item><item><title>Receive instant notifications for finished calculations on your phone</title><link>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone/revision/1</link><pubDate>Wed, 18 Dec 2019 14:34:26 GMT</pubDate><guid isPermaLink="false">6dad98f5-dbc9-4c4d-a9ba-e9da8dc6aa8e:43f5bec0-d8e1-4cb9-8d8b-771ac20ed60d</guid><dc:creator>Micha van der Sloot</dc:creator><comments>https://communities.bentley.com/products/geotech-analysis/w/wiki/45449/receive-instant-notifications-for-finished-calculations-on-your-phone#comments</comments><description>Revision 1 posted to GeoStudio | PLAXIS Wiki by Micha van der Sloot on 12/18/2019 2:34:26 PM&lt;br /&gt;
&lt;div class="content-scrollable-wrapper" style="overflow:auto;border-collapse:collapse;padding-bottom:30px;"&gt;
&lt;table border="0" style="width:500px;background-color:#fffff;border:rgb(86, 170, 28) 0px solid;border-width:1px 0px 0px 0px;"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;PLAXIS 2D&lt;br /&gt;PLAXIS 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;PLAXIS 2D&lt;br /&gt;PLAXIS 3D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Date created&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;29 April 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align:right;border-bottom:rgb(86, 170, 28) 1px solid;padding:4px 5px 4px 50px;"&gt;&lt;strong&gt;Date modified&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align:left;padding:4px 5px 4px 50px;border-bottom:rgb(86, 170, 28) 1px solid;"&gt;29 April 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;tbody&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;!--–– end of Bentley header ––--&gt;
&lt;p&gt;When running long calculations using PLAXIS, it would be great if you can receive instant notifications when this calculation is finished: either via e-mail or a (push) notification on your smartphone (e.g. iPhone or Android device). This could be very useful for calculations that run unattended for example during a meeting, during lunch break or after office hours.&lt;br /&gt;With the implementation of the PLAXIS Remote Scripting / HTTP REST API, this is now possible: once a calculation is finished you can be notified instantly!&lt;/p&gt;
&lt;h2&gt;First step: Message composition&lt;/h2&gt;
&lt;p&gt;Any method that we will use below will first need to calculate the PLAXIS project and gather the results for a short overview of the calculation result.&lt;/p&gt;
&lt;p&gt;First, we need to have the model loaded into PLAXIS and PLAXIS needs to be run as a Remote Scripting server. The PLAXIS Remote Scripting server within PLAXIS 2D or PLAXIS 3D can be activated via the menu item&lt;em&gt; Expert &amp;gt; Configure remote Scripting server&lt;/em&gt;.&lt;br /&gt;See also the related page on &lt;em&gt;&lt;strong&gt;Using PLAXIS Remote scripting with the Python wrapper&lt;/strong&gt;&lt;/em&gt; at the bottom of the page.&lt;/p&gt;
&lt;p&gt;Next step is to use Python scripting to start the calculation, after which we can collect the results:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;check for each phase if the calculation was successful or not&lt;/li&gt;&lt;li&gt;Optional, when desired we can get main characteristics for a calculation type, like the reached value of &lt;em&gt;SumMsf&lt;/em&gt; for a Safety calculation (i.e. the Factor of Safety)&lt;/li&gt;&lt;li&gt;And determine a summary for the notification&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Here we can write a function that gathers the basic phase information: was it calculated, and was it calculated successful or did it fail:&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;gather_phase_overview&lt;/span&gt;(): 
    results &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; [] 
    allpassed &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt; 
    &lt;span style="color:#ff5600;"&gt;for&lt;/span&gt; phase &lt;span style="color:#ff5600;"&gt;in&lt;/span&gt; g_i.Phases[:]: 
        msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;not calculated&amp;quot;&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;not&lt;/span&gt; phase.ShouldCalculate: 
            &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; phase.CalculationResult &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; phase.CalculationResult.ok: 
                msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt; &lt;span style="color:#919191;"&gt;# may be extended for more details &lt;/span&gt;
            &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
                msg &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Failed: error {0}&amp;quot;&lt;/span&gt;.format(phase.LogInfo) 
                allpassed &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        results.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;{0}: {1}&amp;quot;&lt;/span&gt;.format( phase.Name, msg)) 
     &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; allpassed, results
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This can be used to create message data with a subject/summary and a detailed message (the body):&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;get_message_info&lt;/span&gt;(): 
    message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; {&lt;span style="color:#00a33f;"&gt;&amp;quot;Subject&amp;quot;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span style="color:#00a33f;"&gt;&amp;quot;Body&amp;quot;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;&amp;quot;&lt;/span&gt;} 
    allpassed, results &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; gather_phase_overview() 
    &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; allpassed &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt;: 
        message[&lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Calculation OK&amp;quot;&lt;/span&gt; 
    &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
        message[&lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;Calculation failed&amp;quot;&lt;/span&gt; 
    body &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; [&lt;span style="color: #00a33f;"&gt;"Summary for PLAXIS calculation"&lt;/span&gt;] 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;Title: {0}&amp;quot;&lt;/span&gt;.format(g_i.Project.Title)) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;quot;File: {0}&amp;quot;&lt;/span&gt;.format(g_i.Project.Filename)) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;) 
    body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;Phase results:&amp;#39;&lt;/span&gt;) 
    &lt;span style="color:#ff5600;"&gt;for&lt;/span&gt; result &lt;span style="color:#ff5600;"&gt;in&lt;/span&gt; results: 
        body.append(&lt;span style="color:#00a33f;"&gt;&amp;#39;- {0}&amp;#39;&lt;/span&gt;.format(result)) 
    message[&lt;span style="color: #00a33f;"&gt;"Body"&lt;/span&gt;] &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;.join(body) 
    &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; message
&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;E-mail notification&lt;/h2&gt;
&lt;p&gt;With Python, it is possible to send e-mail messages, e.g. by using the SMTP protocol via the &lt;em&gt;smtplib&lt;/em&gt; module, but of course, more methods are available. For a detailed example, please refer to:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;the Python sample on Sending an email using Gmail in the PLAXIS Reference manual Appendix on Python HTTP REST API wrapper.&lt;/li&gt;&lt;li&gt;this example is based on this Python code example: &lt;a href="http://segfault.in/2010/12/sending-gmail-from-python/" rel="noopener noreferrer" target="_blank"&gt;http://segfault.in/2010/12/sending-gmail-from-python/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Push notifications on smart devices&lt;/h2&gt;
&lt;p&gt;Using third party services/apps it is possible to get push messages/notifications on smart devices like iPhones or Android devices. Two of such services are for example:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;BoxCar: &lt;a href="https://boxcar.io/" rel="noopener noreferrer" target="_blank"&gt;https://boxcar.io/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;PushOver: &lt;a href="https://pushover.net/" rel="noopener noreferrer" target="_blank"&gt;https://pushover.net/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Such services have apps available for e.g. iOS and Android. Using the service&amp;#39;s API it is possible to send a self-made notification to these apps on your smartphone.&lt;/p&gt;
&lt;h3&gt;Example: Notifications for iPhone using BoxCar&lt;/h3&gt;
&lt;p&gt;Below we have a sample code to send a message using BoxCar. Documentation on how to send a notification to BoxCar:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-a-notification-to-boxcar-for-ios-users"&gt;http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-...&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Note: to be able to use the Boxcar end-user API, you need your &amp;quot;Access Token&amp;quot;. The access token is available from the general &amp;quot;Settings&amp;quot; screen of Boxcar or from the &lt;a href="https://new.boxcar.io/account/edit" rel="noopener noreferrer" target="_blank"&gt;Boxcar Web Inbox&lt;/a&gt; setting page.&lt;br /&gt;Also, we will use the &lt;em&gt;&lt;strong&gt;requests &lt;/strong&gt;&lt;/em&gt;module, which is not a standard Python module: it is available via &lt;a href="https://pypi.python.org/pypi/requests" rel="noopener noreferrer" target="_blank"&gt;https://pypi.python.org/pypi/requests&lt;/a&gt; (requires to install) and it is also available as part of the Plaxis scripting environment.&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; requests &lt;span style="color:#919191;"&gt;# available at https://pypi.python.org/pypi/requests &lt;/span&gt;
&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; json 
&lt;span style="color:#ff5600;"&gt;import&lt;/span&gt; time

&lt;span style="color:#ff5600;"&gt;class&lt;/span&gt; &lt;span style="color:#21439c;"&gt;BoxCar&lt;/span&gt;: 
    BASE_URL &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;https://new.boxcar.io/api/&amp;quot;&lt;/span&gt; 
    RETRY_ATTEMPTS &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 3 
    RETRY_SLEEP &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 2 
    SOUND &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;done&amp;#39;&lt;/span&gt; 
    ICON &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;https://www.plaxis.com/content/uploads/2016/11/plaxis_64.png&amp;#39;&lt;/span&gt; 
    
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;&lt;span style="color:#a535ae;"&gt;__init__&lt;/span&gt;&lt;/span&gt;(self, access_token): 
        self.access_token &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; access_token 
        self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        self.encoded_data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;None&lt;/span&gt; 
        self.sound&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;self.SOUND
 
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;notify&lt;/span&gt;(self, title, message): 
        attempts &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; 0 
        &lt;span style="color:#ff5600;"&gt;while&lt;/span&gt; attempts &lt;span style="color:#ff5600;"&gt;&amp;lt;&lt;/span&gt; self.RETRY_ATTEMPTS: 
            attempts &lt;span style="color:#ff5600;"&gt;+=&lt;/span&gt; 1 
            result &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; self._send_notification(title, message) 
            &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; result.status_code &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; 201: 
                &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;* Message: %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; title ) 
                &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;* Message delivered @ %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; result.headers[&lt;span style="color: #00a33f;"&gt;'date'&lt;/span&gt;]) 
                self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;True&lt;/span&gt; 
                &lt;span style="color:#ff5600;"&gt;break&lt;/span&gt; 
            &lt;span style="color:#ff5600;"&gt;else&lt;/span&gt;: 
                &lt;span style="color:#ff5600;"&gt;if&lt;/span&gt; attempts &lt;span style="color:#ff5600;"&gt;==&lt;/span&gt; self.RETRY_ATTEMPTS: 
                    &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;! Message delivery FAILED: %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; ( result )) 
                    &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;quot;!   %s&amp;quot;&lt;/span&gt; &lt;span style="color:#ff5600;"&gt;%&lt;/span&gt; result.status_code) 
                self.success &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#a535ae;"&gt;False&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; self.success
 
    &lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;_send_notification&lt;/span&gt;(self, title, long_message ): 
        &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&amp;#39; Documentation on how to send a notification to BoxCar: 
            http://help.boxcar.io/support/solutions/articles/6000004813-how-to-send-a-notification-to-boxcar-for-ios-users
        &amp;#39;&amp;#39;&amp;#39;&lt;/span&gt; 
        &lt;span style="color:#ff5600;"&gt;print&lt;/span&gt;(&lt;span style="color:#00a33f;"&gt;&amp;#39;Sending a notification via BoxCar...&amp;#39;&lt;/span&gt;) 
        long_message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; long_message.replace( &lt;span style="color:#00a33f;"&gt;&amp;quot;n&amp;quot;&lt;/span&gt;, &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;lt;br /&amp;gt;&amp;#39;&lt;/span&gt;) 
        data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; { &lt;span style="color:#00a33f;"&gt;&amp;#39;user_credentials&amp;#39;&lt;/span&gt;: self.access_token, 
                 &lt;span style="color:#00a33f;"&gt;&amp;#39;notification&amp;#39;&lt;/span&gt;: { 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;title&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;quot;PLAXIS: {0}&amp;quot;&lt;/span&gt;.format(title), 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;long_message&amp;#39;&lt;/span&gt;: long_message, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;sound&amp;#39;&lt;/span&gt;: self.sound, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;icon_url&amp;#39;&lt;/span&gt;: self.ICON, 
                     &lt;span style="color:#00a33f;"&gt;&amp;#39;source_name&amp;#39;&lt;/span&gt; : &lt;span style="color:#00a33f;"&gt;&amp;#39;PLAXIS&amp;#39;&lt;/span&gt; 
                     } 
                }  
        notifications_url &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; self.BASE_URL &lt;span style="color:#ff5600;"&gt;+&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;quot;notifications&amp;quot;&lt;/span&gt; 
        headers &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; {&lt;span style="color:#00a33f;"&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;, 
                                   &lt;span style="color:#00a33f;"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;: &lt;span style="color:#00a33f;"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;} 
        self.encoded_data &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; json.dumps(data, ensure_ascii&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;&lt;span style="color:#a535ae;"&gt;False&lt;/span&gt;).encode(&lt;span style="color:#00a33f;"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;) 
        _request &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; requests.post(notifications_url, 
                                 data&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;self.encoded_data, 
                                 headers&lt;span style="color:#ff5600;"&gt;=&lt;/span&gt;headers ) 
        &lt;span style="color:#ff5600;"&gt;return&lt;/span&gt; _request
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now we can combine it to send a message. For this, you will need your BoxCar token. The access token is available from the general &amp;quot;Settings&amp;quot; screen of Boxcar or from  Boxcar Web Inbox setting page.&lt;/p&gt;
&lt;div style="background:#ffffff;overflow:auto;width:auto;border:solid grey;border-width:.1em .1em .1em .8em;padding:.2em .6em;"&gt;&lt;pre style="color:#000;font-size:12px;font-family:&amp;#39;Lucida Console&amp;#39;,Consolas, Inconsolata,&amp;#39;DejaVu Sans Mono&amp;#39;, Monaco, &amp;#39;Courier New&amp;#39;, monospace;padding:2px;margin:2px;line-height:120%;overflow:auto;white-space:pre;"&gt;g_i.calculate() 
&lt;span style="color:#ff5600;"&gt;def&lt;/span&gt; &lt;span style="color:#21439c;"&gt;sendmessage&lt;/span&gt;(): 
    message &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; get_message_info() 
    boxcartoken &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; &lt;span style="color:#00a33f;"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span style="color:#919191;"&gt;# YOUR BOXCAR TOKEN HERE! &lt;/span&gt;
    push &lt;span style="color:#ff5600;"&gt;=&lt;/span&gt; BoxCar(boxcartoken) 
    push.notify(message[ &lt;span style="color: #00a33f;"&gt;"Subject"&lt;/span&gt; ], message[ &lt;span style="color: #00a33f;"&gt;"Body"&lt;/span&gt; ]) 
sendmessage()
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now the push message on e.g. an iPhone will look like this:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;em&gt;&lt;span class="styles file-styles large" id="styles-9-0"&gt; &lt;img class="media-image" id="1" src="/cfs-file/__key/communityserver-wikis-components-files/00-00-00-01-05/python_5F00_notify_5F00_boxcar_5F00_iphone6_5F00_2_5F00_images.png" alt=" " /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;em&gt;Figure 1. Notifications using BoxCar 2: left lock screen push message and on the right the detailed message&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Using the power of &lt;strong&gt;Plaxis Remote Scripting&lt;/strong&gt; it is possible to get instant notifications about your PLAXIS calculations on your mobile devices!&lt;/p&gt;
&lt;div&gt;
&lt;h4&gt;See also&lt;/h4&gt;
&lt;div id="plxrelated" style="padding-left:20px;"&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://www.plaxis.com/support/python-scripts/python-commands-reference/" style="font-size:110%;"&gt;Identify Python commands from Plaxis command line&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Python Scripts]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr style="width:98%;border:1px solid rgb(86, 170, 28);" /&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://www.plaxis.com/support/tips-and-tricks/using-plaxis-remote-scripting-with-the-python-wrapper/" style="font-size:110%;"&gt;Using PLAXIS Remote scripting with the Python wrapper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Tips and Tricks]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;hr style="width:98%;border:1px solid rgb(86, 170, 28);" /&gt;
&lt;div id="plxrelateditem"&gt;
&lt;p&gt;&lt;a href="https://www.plaxis.com/support/videos/remote-scripting-api-drivemining/" style="font-size:110%;"&gt;Remote Scripting API: Drivemining&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:90%;"&gt;[Videos]&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;div style="font-size: 90%;"&gt;Tags: Rest Http, Plaxis 3D, python, API, py cookbook, push, Android, iPhone, mobile, PLAXIS, Remote scripting, cookbook, python cookbook, ios, Notifications, PLAXIS 2D&lt;/div&gt;
</description></item></channel></rss>