remotedroid 0.4.2 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6bd8aa94326f04e26626c2919060c259afea85c5e89f6ae33de505d0af5381b6
4
- data.tar.gz: efbb77b568cc56a821569021dfd6a1c4001645a0019d0d3d56445a3f31887737
3
+ metadata.gz: 99592d4ac1baaef0d04b87d8bb9dd6cfcbdfc5572dacc39c6fabbd5a960f85f3
4
+ data.tar.gz: a5fbd36d797423dd183dccbb2351736ac58f706acf3b88932ae737d43e55a8e9
5
5
  SHA512:
6
- metadata.gz: 68ca84c69885979de74d5265b216808dba934f63854978ffde5e48a49458f88e3483294f555f36685b1a5cc44b2309b285870228c5eb63ca3759b0e41eb7b752
7
- data.tar.gz: ba2aa7d3d3fbf3512b3cfdbd55aa7442499355c3110bcfed6b92a5da516f4a4e39eb3ff8eff6fba5f3702aeb739562d2bde777c31e2c0ce6a9a9581287fda93f
6
+ metadata.gz: 893732ed1fb124c982bdcd6b55d4d2f54acd9a32256d707cde13a13d86fb9547a9b126ab6200b98ed211ae739cf42e95136c5fe444fbd435646607b6e8fda9a7
7
+ data.tar.gz: a651dd655ab1dcb59549d7abd5d32a948f4fbf04ec134f9c35ff104ff7f9def9308a8f8acf9751e7cefa27e7ca4517af7e310a5603de6ab6a196271a1ca54b5c
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -8,21 +8,45 @@ require 'app-routes'
8
8
  require 'sps-sub'
9
9
  require 'ruby-macrodroid'
10
10
 
11
+ # PASTE_START
11
12
 
12
13
  # Here's what's available so far:
13
14
  #
14
15
  # # Triggers
15
16
  #
17
+ # ## Battery/Power
18
+ #
19
+ # * Power button toggle
20
+ #
21
+ # ## Connectivity
22
+ #
23
+ # ### Wifi State Change
24
+ #
25
+ # * Connected to Network
26
+ #
27
+ # ## Device Events
28
+ #
29
+ # * screen on
30
+ #
16
31
  # ## Sensors
17
- #
32
+ #
33
+ # * Activity Recognition
18
34
  # * proximity (near)
19
35
  # * shake device
20
36
  #
37
+ # ## User Input
38
+ #
39
+ # * Swipe Screen
40
+ #
21
41
  # ------------------------------------
22
42
  #
23
43
  # # Actions
24
44
  #
25
- ## Connectivity
45
+ # ## Camera/Photo
46
+ #
47
+ # * Take Picture
48
+ #
49
+ # ## Connectivity
26
50
  #
27
51
  # * Enable HotSpot
28
52
  #
@@ -40,6 +64,10 @@ require 'ruby-macrodroid'
40
64
  #
41
65
  # * Share Location
42
66
  #
67
+ # ## MacroDroid specific
68
+ #
69
+ # * Disable Macro
70
+ #
43
71
  # ## Media
44
72
  #
45
73
  # * Play sound (Doda)
@@ -50,6 +78,7 @@ require 'ruby-macrodroid'
50
78
  #
51
79
  # ## Screen
52
80
  #
81
+ # * Keep Device Awake
53
82
  # * Screen On
54
83
  #
55
84
 
@@ -152,7 +181,22 @@ a:
152
181
  Disable Hotspot
153
182
  End If
154
183
 
155
-
184
+ m: Take Picture
185
+ t: webhook
186
+ a:
187
+ Take Picture
188
+ Rear Facing
189
+ a: wait 2 seconds
190
+ a: webhook
191
+
192
+ m: stay awake
193
+ t: webhook
194
+ a: stay awake
195
+
196
+ m: stay awake off
197
+ t: webhook
198
+ a: stay awake off
199
+
156
200
  m: Share location
157
201
  t:
158
202
  WebHook
@@ -165,7 +209,16 @@ a:
165
209
  HTTP GET
166
210
  identifier: location
167
211
  coords: [lv=coords]
212
+ cell: [cell_id]
213
+ ssid: [ssid]
214
+ alt: [last_loc_alt]
215
+ time: [last_loc_age_timestamp]
216
+ mph: [last_loc_speed_mph]
217
+ kph: [last_loc_speed_kmh]
218
+ device: [device_model]
219
+ battery: [battery]
168
220
  type: query
221
+
169
222
 
170
223
  m: query
171
224
  t: WebHook
@@ -222,586 +275,162 @@ a:
222
275
  m: Power connected
223
276
  t: Power Connected: Any
224
277
  a: webhook
225
-
226
-
227
- EOF
228
-
229
- =begin
230
- m: Screen
231
- v: on: true
232
- t: WebHook
233
- a:
234
- If on = true
235
- Screen On
236
- Else
237
- Screen Off
238
- End If
239
-
240
- =end
241
-
242
- module RemoteDroid
243
-
244
- class Model
245
- include AppRoutes
246
-
247
- def initialize(obj=nil, root: 'device1', debug: false)
248
-
249
- super()
250
- @root, @debug = root, debug
251
- @location = nil
252
-
253
- if obj then
254
-
255
- s = obj.strip
256
-
257
- puts 's: ' + s.inspect if @debug
258
-
259
- if s[0] == '<' or s.lines[1][0..1] == ' ' then
260
-
261
- puts 'before easydom' if @debug
262
-
263
- s2 = if s.lines[1][0..1] == ' ' then
264
-
265
- lines = s.lines.map do |line|
266
- line.sub(/(\w+) +is +(\w+)$/) {|x| "#{$1} {switch: #{$2}}" }
267
- end
268
-
269
- lines.join
270
-
271
- else
272
- s
273
- end
274
-
275
- @ed = EasyDom.new(s2)
276
- else
277
- build(s, root: root)
278
- end
279
-
280
- end
281
-
282
- end
283
-
284
- def build(raw_requests, root: @root)
285
-
286
- @ed = EasyDom.new(debug: false, root: root)
287
- raw_requests.lines.each {|line| request(line) }
288
-
289
- end
290
-
291
-
292
- def get_thing(h)
293
-
294
- h[:thing].gsub!(/ /,'_')
295
-
296
- if not h.has_key? :location then
297
- location = false
298
- h[:location] = find_path(h[:thing])
299
- else
300
- location = true
301
- end
302
-
303
- puts 'h: ' + h.inspect if @debug
304
-
305
- a = []
306
- a += h[:location].split(/ /)
307
- a << h[:thing]
308
- status = a.inject(@ed) {|r,x| r.send(x)}.send(h[:action])
309
-
310
- if location then
311
- "The %s %s is %s." % [h[:location], h[:thing], status]
312
- else
313
- "%s is %s." % [h[:thing].capitalize, status]
314
- end
315
-
316
- end
317
-
318
- # Object Property (op)
319
- # Helpful for accessing properites in dot notation
320
- # e.g. op.livingroom.light.switch = 'off'
321
- #
322
- def op()
323
- @ed
324
- end
325
-
326
- def query(s)
327
- @ed.e.element(s)
328
- end
329
-
330
- # request accepts a string in plain english
331
- # e.g. request 'switch the livingroom light on'
332
- #
333
- def request(s)
334
-
335
- params = {request: s}
336
- requests(params)
337
- h = find_request(s)
338
-
339
- method(h.first[-1]).call(h).gsub(/_/,' ')
340
-
341
- end
342
-
343
- def set_thing(h)
344
-
345
- h[:thing].gsub!(/ /,'_')
346
- h[:location] = find_path(h[:thing]) unless h.has_key? :location
347
-
348
- a = []
349
- a += h[:location].split(/ /)
350
- a << h[:thing]
351
-
352
- a.inject(@ed) {|r,x| r.send(x)}.send(h[:action], h[:value])
353
-
354
- end
355
-
356
- def to_sliml(level: 0)
357
-
358
- s = @ed.to_sliml
359
-
360
- return s if level.to_i > 0
361
-
362
- lines = s.lines.map do |line|
363
-
364
- line.sub(/\{[^\}]+\}/) do |x|
365
-
366
- a = x.scan(/\w+: +[^ ]+/)
367
- if a.length == 1 and x[/switch:/] then
368
278
 
369
- val = x[/(?<=switch: ) *["']([^"']+)/,1]
370
- 'is ' + val
371
- else
372
- x
373
- end
374
-
375
- end
376
- end
377
-
378
- lines.join
379
-
380
- end
381
-
382
- def to_xml(options=nil)
383
- @ed.xml(pretty: true).gsub(' style=\'\'','')
384
- end
385
-
386
- alias xml to_xml
387
-
388
- # to_xml() is the preferred method
389
-
390
- protected
391
-
392
- def requests(params)
393
-
394
- # e.g. switch the livingroom gas_fire off
395
- #
396
- get /(?:switch|turn) the ([^ ]+) +([^ ]+) +(on|off)$/ do |location, device, onoff|
397
- {type: :set_thing, action: 'switch=', location: location, thing: device, value: onoff}
398
- end
399
-
400
- # e.g. switch the gas _fire off
401
- #
402
- get /(?:switch|turn) the ([^ ]+) +(on|off)$/ do |device, onoff|
403
- {type: :set_thing, action: 'switch=', thing: device, value: onoff}
404
- end
405
-
406
- # e.g. is the livingroom gas_fire on?
407
- #
408
- get /is the ([^ ]+) +([^ ]+) +(?:on|off)\??$/ do |location, device|
409
- {type: :get_thing, action: 'switch', location: location, thing: device}
410
- end
411
-
412
- # e.g. enable airplane mode
413
- #
414
- get /((?:dis|en)able) ([^$]+)$/ do |state, service|
415
- {type: :set_thing, action: 'switch=', thing: service, value: state + 'd'}
416
- end
417
-
418
- # e.g. switch airplane mode off
419
- #
420
- get /switch (.*) (on|off)/ do |service, rawstate|
421
-
422
- state = rawstate == 'on' ? 'enabled' : 'disabled'
423
- {type: :set_thing, action: 'switch=', thing: service, value: state}
424
-
425
- end
426
-
427
- # e.g. is airplane mode enabed?
428
- #
429
- get /is (.*) +(?:(?:dis|en)abled)\??$/ do |service|
430
- {type: :get_thing, action: 'switch', thing: service.gsub(/ /,'_')}
431
- end
432
-
433
- # e.g. is the gas_fire on?
434
- #
435
- get /is the ([^ ]+) +(?:on|off)\??$/ do |device|
436
- location = find_path(device)
437
- {type: :get_thing, action: 'switch', location: location, thing: device}
438
- end
439
-
440
- # e.g. fetch the livingroom temperature reading
441
- #
442
- get /fetch the ([^ ]+) +([^ ]+) +(?:reading)$/ do |location, device|
443
- {type: :get_thing, action: 'reading', location: location, thing: device}
444
- end
445
-
446
- # e.g. fetch the temperature reading
447
- #
448
- get /fetch the ([^ ]+) +(?:reading)$/ do |device|
449
- location = find_path(device)
450
- {type: :get_thing, action: 'reading', location: location, thing: device}
451
- end
279
+ m: screen on off
280
+ t: screen on
281
+ a: webhook
452
282
 
453
- end
454
-
455
- private
456
-
457
- def find_path(s)
458
- puts 'find_path s: ' + s.inspect if @debug
459
- found = query('//'+ s)
460
- return unless found
461
- a = found.backtrack.to_xpath.split('/')
462
- a[1..-2].join(' ')
463
- end
464
-
465
- alias find_request run_route
283
+ m: Power Button Toggle3
284
+ t: Power Button Toggle (3)
285
+ a: webhook
466
286
 
467
- end
287
+ m: Power Button Toggle4
288
+ t: Power Button Toggle (4)
289
+ a: webhook
468
290
 
469
- class Controller
470
-
471
- attr_reader :model, :control
472
- attr_accessor :title, :macros, :store
291
+ m: Power Button Toggle5
292
+ t: Power Button Toggle (5)
293
+ a: webhook
473
294
 
474
- def initialize(mcs, model=MODEL, deviceid: nil, debug: false)
475
-
476
- @debug = debug
477
- @syslog = []
478
-
479
- @control = Control.new(deviceid)
480
- @macros = mcs.macros
481
-
482
- if model then
483
- @model = Model.new(model)
484
- end
485
-
486
- @store = {}
487
- @query = Query.new(self)
295
+ m: Connected to network
296
+ t:
297
+ Connected to network
298
+ Any Network
299
+ a: wait 2 seconds
300
+ a:
301
+ webhook
302
+ ssid: [ssid]
488
303
 
489
- end
490
-
491
- def export(s)
492
- @macros = MacroDroid.new(s).macros
493
- end
494
-
495
- def invoke(name, options={})
496
-
497
- if @control.respond_to? name.to_sym then
498
- @control.method(name.to_sym).call(options)
499
- else
500
- @control.http_exec name.to_sym, options
501
- end
502
- end
304
+ m: In Vehicle
305
+ t:
306
+ Activity - In Vehicle
307
+ Confidence >= 50%
308
+ a:
309
+ webhook
310
+ identifier: activity
311
+ index: 0
503
312
 
504
- # Object Property (op)
505
- # Helpful for accessing properites in dot notation
506
- # e.g. op.livingroom.light.switch = 'off'
507
- #
508
- def op()
509
- @model.op
510
- end
313
+ m: On Bicycle
314
+ t:
315
+ Activity - On Bicycle
316
+ Confidence >= 50%
317
+ a:
318
+ webhook
319
+ identifier: activity
320
+ index: 1
511
321
 
512
- def query(id=nil)
513
-
514
- return @query unless id
515
-
516
- @store[id] = nil
517
-
518
- sys = %i(accelerometer_rotation)
519
-
520
- global = [:airplane_mode_on, :bluetooth_on, :cell_on, :device_name, \
521
- :usb_mass_storage_enabled, :wifi_on]
522
-
523
- secure = %i(bluetooth_name flashlight_enabled)
524
-
525
-
526
- # send http request via macrodroid.com API
527
-
528
- if id.downcase.to_sym == :location then
529
- @control.http_exec id
530
- elsif sys.include? id
531
- @control.http_exec :'query-setting-system', {qvar: id}
532
- elsif global.include? id
533
- @control.http_exec :'query-setting-global', {qvar: id}
534
- elsif secure.include? id
535
- @control.http_exec :'query-setting-secure', {qvar: id}
536
- else
537
- @control.http_exec :query, {qvar: id}
538
- end
539
-
540
- # wait for the local variable to be updated
541
- # timeout after 5 seoncds
542
- t = Time.now
543
-
544
- begin
545
- sleep 1
546
- end until @store[id] or Time.now > t + 5
547
-
548
- return {warning: 'HTTP response timeout'} if Time.now > t+5
549
-
550
- return @store[id]
322
+ m: Running
323
+ t:
324
+ Activity - Running
325
+ Confidence >= 50%
326
+ a:
327
+ webhook
328
+ identifier: activity
329
+ index: 2
551
330
 
552
-
553
- end
554
-
555
- def request(s)
556
- @model.request s
557
- end
558
-
559
-
560
- def trigger(name, detail={time: Time.now})
561
-
562
- macros = @macros.select do |macro|
563
-
564
- puts 'macro: ' + macro.inspect if @debug
331
+ m: Walking
332
+ t:
333
+ Activity - Walking
334
+ Confidence >= 50%
335
+ a:
336
+ webhook
337
+ identifier: activity
338
+ index: 3
565
339
 
566
- # fetch the associated properties from the model if possible and
567
- # merge them into the detail.
568
- #
569
- valid_trigger = macro.match?(name, detail, @model.op)
570
-
571
- puts 'valid_trigger: ' + valid_trigger.inspect if @debug
572
-
573
- if valid_trigger then
574
- @syslog << [Time.now, :trigger, name]
575
- @syslog << [Time.now, :macro, macro.title]
576
- end
577
-
578
- valid_trigger
579
-
580
- end
581
-
582
- puts 'macros: ' + macros.inspect if @debug
583
-
584
- macros.flat_map(&:run)
585
- end
340
+ m: Still
341
+ t:
342
+ Activity - Still
343
+ Confidence >= 83%
344
+ a:
345
+ webhook
346
+ identifier: activity
347
+ index: 4
586
348
 
587
- alias trigger_fired trigger
349
+ m: Swipe top left across
350
+ t:
351
+ Swipe Screen
352
+ Top Left - Across
353
+ a:
354
+ webhook
355
+ identifier: swipe
356
+ start: 0
357
+ motion: 0
358
+
359
+ m: Swipe top left diagonal
360
+ t:
361
+ Swipe Screen
362
+ Top Left - Diagonal
363
+ a:
364
+ webhook
365
+ identifier: swipe
366
+ start: 0
367
+ motion: 1
368
+
369
+ m: Swipe top left down
370
+ t:
371
+ Swipe Screen
372
+ Top Left - Down
373
+ a:
374
+ webhook
375
+ identifier: swipe
376
+ start: 0
377
+ motion: 2
378
+
379
+ m: Swipe top right across
380
+ t:
381
+ Swipe Screen
382
+ Top Right - Across
383
+ a:
384
+ webhook
385
+ identifier: swipe
386
+ start: 1
387
+ motion: 0
588
388
 
589
- def update(id, val)
590
- key = id == :location ? id : val.keys.first.to_sym
591
- @store[key] = val
592
- end
593
-
594
389
 
595
- end
390
+ m: Swipe top right diagonal
391
+ t:
392
+ Swipe Screen
393
+ Top Right - Diagonal
394
+ a:
395
+ webhook
396
+ identifier: swipe
397
+ start: 1
398
+ motion: 1
399
+
400
+ m: Swipe top right down
401
+ t:
402
+ Swipe Screen
403
+ Top Right - Down
404
+ a:
405
+ webhook
406
+ identifier: swipe
407
+ start: 1
408
+ motion: 2
596
409
 
597
- class Service
598
- def initialize(callback)
599
- @callback = callback
600
- end
601
- end
602
-
603
- class Bluetooth
604
- def enable()
605
- end
606
- end
607
-
608
- class Toast < Service
609
-
610
- def invoke()
611
- @callback.call :toast
612
- end
613
-
614
- end
615
-
616
- class Torch < Service
617
-
618
- def toggle()
619
- @callback.http_exec :torch
620
- end
621
-
622
- end
623
-
624
- class ControlHelper
625
-
626
- def initialize(callback)
627
- @callback
628
- end
629
- end
410
+ m: flip from up to down
411
+ t: Flip Device Face Up -> Face Down
412
+ a:
413
+ webhook
414
+ identifier: flip_device
415
+ facedown: true
630
416
 
631
- class Control
632
-
633
- def initialize(dev=nil, deviceid: dev, remote_url: nil, debug: false)
634
-
635
- @deviceid, @remote_url, @debug = deviceid, remote_url, debug
636
- @torch = Torch.new(self)
637
- end
638
-
639
- def bluetooth()
640
- @bluetooth
641
- end
642
-
643
- def camera_flash_light(options={})
644
- http_exec 'camera-flash-light', options
645
- end
417
+ m: flip from down to up
418
+ t: Flip Device Face Down -> Face Up
419
+ a:
420
+ webhook
421
+ identifier: flip_device
422
+ facedown: false
423
+ EOF
424
+ s="
646
425
 
647
- def hotspot(state=nil)
648
-
649
- if state then
650
- http_exec 'hotspot', {enable: state == :enable}
651
- else
652
426
 
653
- def self.enable()
654
- http_exec 'hotspot', {enable: true}
655
- end
656
-
657
- def self.on()
658
- self.enable
659
- end
660
-
661
- def self.disable()
662
- http_exec 'hotspot', {enable: false}
663
- end
664
-
665
- def self.off()
666
- self.disable
667
- end
668
-
669
- self
670
-
671
- end
672
- end
673
-
674
- def http_exec(command, options={})
675
-
676
- url = "https://trigger.macrodroid.com/%s/%s" % [@deviceid, command]
677
-
678
- if options and options.any? then
679
- h = options
680
- url += '?' + \
681
- URI.escape(h.map {|key,value| "%s=%s" % [key, value]}.join('&'))
682
- end
683
-
684
- s = open(url).read
685
-
686
- end
687
-
688
- def location(options={})
689
- http_exec 'location'
690
- end
691
-
692
- def say_current_time(options={})
693
- http_exec 'say-current-time'
694
- end
695
-
696
- alias say_time say_current_time
697
-
698
- def screen(state=nil)
699
-
700
- if state then
701
- http_exec 'screen', {on: state == :on}
702
- else
703
-
704
- def self.on()
705
- http_exec 'screen', {on: true}
706
- end
707
-
708
- def self.off()
709
- http_exec 'screen', {on: false}
710
- end
711
-
712
- self
713
-
714
- end
715
- end
716
-
717
- def share_location(options={})
718
- http_exec 'share-location'
719
- end
720
-
721
- def speak_text(obj)
722
-
723
- options = case obj
724
- when String
725
- {text: obj}
726
- when Hash
727
- obj
728
- end
729
-
730
- http_exec 'speak-text', options
731
- end
732
-
733
- alias say speak_text
734
-
735
- def toast(options={})
736
- http_exec :toast, options
737
- end
738
-
739
- def torch(options={})
740
- http_exec :torch
741
- end
742
-
743
- def vibrate(options={})
744
- http_exec :vibrate
745
- end
746
427
 
747
428
 
748
- def write(s)
749
-
750
- MacroDroid.new(RD_MACROS, deviceid: @deviceid,
751
- remote_url: @remote_url, debug: @debug).export s
752
-
753
- end
754
-
755
- alias export write
756
-
757
- def method_missing2(method_name, *args)
758
- http_exec(method_name, args.first)
759
- end
760
-
761
- end
762
-
763
- class Query
764
-
765
- def initialize(callback)
766
- @callback = callback
767
- end
768
-
769
- def airplane_mode_enabled?()
770
- q(:airplane_mode_on).to_i > 0
771
- end
772
-
773
- def battery()
774
- q(:battery).to_i
775
- end
776
-
777
- def current_brightness()
778
- q(:current_brightness).to_i
779
- end
429
+
780
430
 
781
- alias brightness current_brightness
782
-
783
- def cell_id()
784
- q(:cell_id)
785
- end
786
-
787
- alias cell_tower cell_id
788
-
789
- def ip()
790
- q(:ip)
791
- end
792
-
793
- def location()
794
- @callback.query(:location)[:coords]
795
- end
431
+ "
796
432
 
797
-
798
- private
799
-
800
- def q(id)
801
- @callback.query(id)[id]
802
- end
803
-
804
- end
433
+ module RemoteDroid
805
434
 
806
435
  class Server
807
436
 
@@ -818,92 +447,7 @@ module RemoteDroid
818
447
  end
819
448
 
820
449
  end
821
-
822
- class Client
823
-
824
- def initialize(host='127.0.0.1')
825
- @drb = OneDrb::Client.new host: host, port: '5777'
826
- end
827
-
828
- def control
829
- @drb.control
830
- end
831
-
832
- def export(s)
833
- @drb.export(s)
834
- end
835
-
836
- def invoke(s, *args)
837
- @drb.invoke(s, *args)
838
- end
839
-
840
- def query(id=nil)
841
-
842
- return @drb.query unless id
843
- t = Time.now
844
- h = @drb.query(id)
845
- h.merge({latency: (Time.now - t).round(3)})
846
-
847
- end
848
-
849
- def update(key, val)
850
- @drb.update key.to_sym, val
851
- end
852
-
853
- def store()
854
- @drb.store
855
- end
856
-
857
- # -- helpful methods -----------------
858
-
859
- def battery()
860
- query.battery
861
- end
862
-
863
- def cell_tower()
864
- query.cell_tower
865
- end
866
-
867
- def hotspot(state=nil)
868
- control.hotspot state
869
- end
870
-
871
- def location()
872
- query.location
873
- end
874
-
875
- def say(text)
876
- control.speak_text text
877
- end
878
-
879
- def say_time()
880
- control.say_time
881
- end
882
-
883
- alias saytime say_time
884
-
885
- def screen(state=nil)
886
- control.screen state
887
- end
888
-
889
- def screen_on()
890
- screen :on
891
- end
892
450
 
893
- def screen_off()
894
- screen :off
895
- end
896
-
897
- def torch()
898
- control.torch
899
- end
900
-
901
- def vibrate
902
- control.vibrate
903
- end
904
-
905
- end
906
-
907
451
  class TriggerSubscriber < SPSSub
908
452
 
909
453
  def initialize(host: 'sps.home', drb_host: '127.0.0.1')
@@ -938,8 +482,20 @@ module RemoteDroid
938
482
 
939
483
  context, json = msg.split(/:\s+/,2)
940
484
  category, action = context.split('/',2)
941
- @remote.control.method(action.to_sym)\
485
+
486
+ if action == 'force_macro_run' then
487
+
488
+ self.notice 'macrodroid2: fmr'
489
+ a = @remote.run_macro(JSON.parse(json, symbolize_names: true))
490
+
491
+ a.each do |msg|
492
+ self.notice 'macrodroid/action: ' + msg
493
+ end
494
+
495
+ else
496
+ @remote.control.method(action.to_sym)\
942
497
  .call(JSON.parse(json, symbolize_names: true))
498
+ end
943
499
 
944
500
  end
945
501
 
@@ -959,6 +515,7 @@ module RemoteDroid
959
515
  super(topic: topic) do |msg|
960
516
 
961
517
  json, id = msg.split(/:\s+/,2).reverse
518
+
962
519
  h = JSON.parse(json, symbolize_names: true)
963
520
  id ||= h.keys.first
964
521
  @remote.update id.to_sym, h
@@ -969,3 +526,12 @@ module RemoteDroid
969
526
 
970
527
  end
971
528
  end
529
+
530
+ # PASTE_END
531
+
532
+
533
+ require 'remotedroid/model'
534
+ require 'remotedroid/query'
535
+ require 'remotedroid/control'
536
+ require 'remotedroid/controller'
537
+ require 'remotedroid/client'