Sunday, December 4, 2022

#1 2022-10-21 08:21:31 am

Fredrik71
Member
Registered: 2019-10-23
Posts: 1091

Scriptable AS to feed Dashboard (Web API)

So you are thinking what could I do with AppleScript records or scriptable application.
You may ask could I take data from system A to system B... In event-driven application like
Node-Red (it use Node.js). To make this simple we need to first make sure we have the right format as input for Node-Red.

That format is JSON String.

1. So we need to convert AppleScript record to JSONString. We will use ASObjC for that.
2. In Node-Red we inject message every 5s
3. The flow in Node-Red will convert JSON String to JSON Object.
4. To visual the change we setup a dashboard of table in Node-Red.

We play tracks from Apple Music that will feed the dashboard with data every 5s.

Ps. This is a standard script to execute a handler function it doesn't use any arguments.

If you wonder what this is... return "["... "]" in handler is all about.
To make a array object of JSON Objects we need it for the table in the dashboard. If we only like to get the values from some keys in JSON we do not need it.


Applescript:

use framework "Foundation"
use scripting additions

on run argv
   set aList to {}
   try
       set countItems to count items of argv
       repeat with i from 1 to countItems
           if countItems > 0 then
               copy item i of argv to end of aList
           end if
       end repeat
   end try
   
   -- the handler
   its makeJSONString(getTrackInfo())
end run

on getTrackInfo()
   tell application "Music"
       if player state is playing then
           set currentTrack to current track
           tell currentTrack
               {|Artist|:its artist, |Name|:its name, |Album|:its album, |Genre|:its genre, |Year|:its year}
           end tell
       else
           return
       end if
   end tell
end getTrackInfo

on makeJSONString(theRecord)
   set {theData, theError} to current application's NSJSONSerialization's dataWithJSONObject:theRecord options:0 |error|:(reference)
   if theData is missing value then error (theError's localizedDescription() as text)
   set theString to current application's NSString's alloc()'s initWithData:theData encoding:(current application's NSUTF8StringEncoding)
   return "[" & (theString as text) & "]"
end makeJSONString

Node-Red - flows
node-red.png

Dashboard (From Node-Red)
node-red2.png

Last edited by Fredrik71 (2022-10-21 02:21:37 pm)


Node-RED makes it easy to automate IoT

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)