HacklabMQ: Difference between revisions

From Hacklab.TO Public Wiki
Jump to navigation Jump to search
No edit summary
(Updating docs since door.entry is now JSON, not XML.)
 
(23 intermediate revisions by 2 users not shown)
Line 3: Line 3:
== Exchanges ==
== Exchanges ==
* door.entry - Fanout exchange, one message gets pushed to the exchange
* door.entry - Fanout exchange, one message gets pushed to the exchange
** Format: XML format described on the [[doorbot]] page each time a card is swiped at the door.
** Format: JSON message each time a card is swiped at any door associated with the HackLab.
* notification.graphic - Fanout exchange, messages pushed to this exchange indicate animated graphics which should be sent to lab occupants somehow (e.g. LED sign)
* notification.graphic - Fanout exchange, messages pushed to this exchange indicate animated graphics which should be sent to lab occupants somehow (e.g. LED sign)
** Format: Name of the animation to display. Currently "ostrich" is the only supported animation.
** Format: Name of the animation to display. Currently "ostrich" is the only supported animation.
* notification.general - Fanout exchange, messages pushed to this exchange indicate graphics which should be sent to lab occupants somehow (e.g. LED sign, twitter, doorbot)
* notification.general - Fanout exchange, messages pushed to this exchange indicate graphics which should be sent to lab occupants somehow (e.g. LED sign, twitter, doorbot)
** Format: JSON, 'text' and 'image' keys, images referenced should be in NFS user home directories
** Format: JSON, 'text' and 'image' keys, images referenced should be in NFS user home directories, 'public' key says whether to hide or show this message in public spaces
* statistics.bandwidth - Fanout exchange, messages pushed to this exchange indicate bandwidth statistics that can be stored/reported by other systems
* statistics.bandwidth - Fanout exchange, messages pushed to this exchange indicate bandwidth statistics that can be stored/reported by other systems
** Format: TBD
** Format: TBD
* statistics.power - Fanout exchange, messages pushed to this exchange indicate power statistics that can be stored/reported by other systems
* statistics.power - Fanout exchange, messages pushed to this exchange indicate power statistics that can be stored/reported by other systems
** Format: TBD
** Format: JSON, 'meter_id' key for what circuit or area is being metered (using standard lab electrical system identifiers), 'watts' for how many watts are in use at the time of reporting, 'cost' for cost per hour at the present time based on the wattage in use
* statistics.occupancy - Fanout exchange, messages pushed to this exchange indicate which areas of the lab are occupied at the present time.
** Format: JSON, 'area' for which area the report is for, 'occupied' for whether this area is presently occupied, 'last_detected' for the number of minutes ago movement was last detected in the area, 'change' for whether this is a change in the occupied status from the last report.
* eight - Fanout exchange, messages sent to this exchange indicate the number 8 should be printed full-screen (white text on a black background) and/or announced verbally. See also: [https://www.youtube.com/watch?v=87H6m2v4zNs 8].
** Format: {eight: 8}


== Queues ==
== Queues ==
Line 23: Line 27:
   "Building Door System" [shape=house style=filled fillcolor="palevioletred1"]
   "Building Door System" [shape=house style=filled fillcolor="palevioletred1"]
   "Building Power System" [shape=house style=filled fillcolor="palevioletred1"]
   "Building Power System" [shape=house style=filled fillcolor="palevioletred1"]
  "HackLab Power Monitor\npowermon" [shape=house style=filled fillcolor="palevioletred1"]
  "WiFi Occupancy Sensors" [shape=house style=filled fillcolor="palevioletred1"]
   "LED Sign\nsign0" [shape=house style=filled fillcolor="palevioletred1"]
   "LED Sign\nsign0" [shape=house style=filled fillcolor="palevioletred1"]
   "Stats Sign\nsign1" [shape=house style=filled fillcolor="palevioletred1"]
   "Stats Sign\nsign1" [shape=house style=filled fillcolor="palevioletred1"]
  "External Physical System" [shape=house style=filled fillcolor="palevioletred1"]


  "exchange" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "door.entry" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "door.entry" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "notification.general" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "notification.general" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "notification.graphic" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "notification.graphic" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "statistics.power" [shape=trapezium style=dotted]
  "notification.text" [shape=trapezium style=filled fillcolor="paleturquoise1"]
   "statistics.bandwidth" [shape=trapezium style=dotted]
   "statistics.power" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 
   "statistics.bandwidth" [shape=trapezium style=filled fillcolor="paleturquoise1"]
  "statistics.occupancy" [shape=trapezium style=filled fillcolor="paleturquoise1"]
  "statistics.hvac" [shape=trapezium style=filled fillcolor="paleturquoise1"]
  "eight" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 
  "queue" [shape=box style=filled fillcolor="palegreen1"]
   "door.entry.twitter" [shape=box style=filled fillcolor="palegreen1"]
   "door.entry.twitter" [shape=box style=filled fillcolor="palegreen1"]
   "door.entry.notification" [shape=box style=filled fillcolor="palegreen1"]
   "door.entry.notification" [shape=box style=filled fillcolor="palegreen1"]
Line 37: Line 50:
   "notification.general.ledsign" [shape=box style=filled fillcolor="palegreen1"]
   "notification.general.ledsign" [shape=box style=filled fillcolor="palegreen1"]
   "notification.graphic.ledsign" [shape=box style=filled fillcolor="palegreen1"]
   "notification.graphic.ledsign" [shape=box style=filled fillcolor="palegreen1"]
   "statistics.power.statssign" [shape=box style=dotted style=dotted]
  "notification.text.ledsign" [shape=box style=filled fillcolor="palegreen1"]
   "statistics.bandwidth.statssign" [shape=box style=dotted]
   "statistics.power.statssign" [shape=box style=filled fillcolor="palegreen1"]
    
   "statistics.bandwidth.statssign" [shape=box style=filled fillcolor="palegreen1"]
  "statistics.power.graph" [shape=box style=filled fillcolor="palegreen1"]
  "statistics.occupancy.graph" [shape=box style=filled fillcolor="palegreen1"]
  "statistics.occupancy.hacktouch" [shape=box style=filled fillcolor="palegreen1"]
   "statistics.occupancy.hvac" [shape=box style=filled fillcolor="palegreen1"]
  "eight.signs" [shape=box style=filled fillcolor="palegreen1"]
 
  "External API" [shape=hexagon style=filled fillcolor="royalblue1"]
   "HTTP API\nTwitter" [shape=hexagon style=filled fillcolor="royalblue1"]
   "HTTP API\nTwitter" [shape=hexagon style=filled fillcolor="royalblue1"]
   "IRC #hacklabto (recv)" [shape=hexagon style=filled fillcolor="royalblue1"]
   "IRC #hacklabto (recv)" [shape=hexagon style=filled fillcolor="royalblue1"]
   "IRC #hacklabto (send)" [shape=hexagon style=filled fillcolor="royalblue1"]
   "IRC #hacklabto (send)" [shape=hexagon style=filled fillcolor="royalblue1"]
    
   "HTTP API\nBAYweb Cloud HVAC" [shape=hexagon style=filled fillcolor="royalblue1"]
 
  "Service"
 
   "Building Door System" -> "HTTP Service\ncard_event" -> "door.entry"
   "Building Door System" -> "HTTP Service\ncard_event" -> "door.entry"
   "door.entry" -> "door.entry.notification"
   "door.entry" -> "door.entry.notification"
Line 61: Line 84:
   "IRC #hacklabto (recv)" -> "doorbot (HacklabMQPublisher)"
   "IRC #hacklabto (recv)" -> "doorbot (HacklabMQPublisher)"


   "doorbot (HacklabMQPublisher)" -> "notification.graphic"
  "doorbot (HacklabMQPublisher)" -> "notification.text" [ label="!sign" ]
  "notification.text" -> "notification.text.ledsign"
  "notification.text.ledsign" -> "ledsign_feeder"
  "ledsign_feeder" ->  "HTTP Service\nSign Text Renderer"
 
   "doorbot (HacklabMQPublisher)" -> "notification.graphic" [ label="*ostrich*" ]
   "notification.graphic" -> "notification.graphic.ledsign"
   "notification.graphic" -> "notification.graphic.ledsign"
   "notification.graphic.ledsign" -> "ledsign_ostrich_feeder"
   "notification.graphic.ledsign" -> "ledsign_ostrich_feeder"
Line 67: Line 95:


   "Building Power System" -> "HTTP Service\npowerdata" -> "statistics.power"
   "Building Power System" -> "HTTP Service\npowerdata" -> "statistics.power"
  "HackLab Power Monitor\npowermon" -> "powercollect" -> "statistics.power"
   "statistics.power" -> "statistics.power.statssign"
   "statistics.power" -> "statistics.power.statssign"
   "statistics.power.statssign" -> "statssignd"
   "statistics.power.statssign" -> "statssignd"
  "statistics.power" -> "statistics.power.graph" -> "powergraph" -> "HTTP Frontend\nHackLab AMQP Graphs"


   "Firewall SNMP" -> "bandwidth_feeder" -> "statistics.bandwidth"  
   "Firewall SNMP" -> "bandwidth_feeder" -> "statistics.bandwidth"  
   "statistics.bandwidth" -> "statistics.bandwidth.statssign"
   "statistics.bandwidth" -> "statistics.bandwidth.statssign"
   "statistics.bandwidth.statssign" -> "statssignd"
   "statistics.bandwidth.statssign" -> "statssignd"
 
  "WiFi Occupancy Sensors" -> "occupancy_collector" -> "statistics.occupancy"
  "statistics.occupancy" -> "statistics.occupancy.graph" -> "occupancygraph" -> "HTTP Frontend\nHackLab AMQP Graphs"
  "statistics.occupancy" -> "statistics.occupancy.hacktouch" -> "hacktouch_occupancy_powersave"
  "statistics.occupancy" -> "statistics.occupancy.hvac" -> "hvac_occupancy_adjuster" -> "HTTP API\nBAYweb Cloud HVAC"
  "HTTP API\nBAYweb Cloud HVAC" -> "hvac_stats_feeder" -> "statistics.hvac"
  "eight" -> "eight.signs"
  "eight.signs" -> "eight_feeder"
  "eight_feeder" -> "Stats Sign\nsign1"
  "eight_feeder" -> "HTTP Service\nSign Text Renderer"


   "statssignd" -> "Stats Sign\nsign1"
   "statssignd" -> "Stats Sign\nsign1"

Latest revision as of 19:30, 18 March 2016

The lab has an AMQP-based message queuing infrastructure shared between various services. The broker RabbitMQ is located on moa (192.168.111.14), which is on the lab's LDAP system.

Exchanges

  • door.entry - Fanout exchange, one message gets pushed to the exchange
    • Format: JSON message each time a card is swiped at any door associated with the HackLab.
  • notification.graphic - Fanout exchange, messages pushed to this exchange indicate animated graphics which should be sent to lab occupants somehow (e.g. LED sign)
    • Format: Name of the animation to display. Currently "ostrich" is the only supported animation.
  • notification.general - Fanout exchange, messages pushed to this exchange indicate graphics which should be sent to lab occupants somehow (e.g. LED sign, twitter, doorbot)
    • Format: JSON, 'text' and 'image' keys, images referenced should be in NFS user home directories, 'public' key says whether to hide or show this message in public spaces
  • statistics.bandwidth - Fanout exchange, messages pushed to this exchange indicate bandwidth statistics that can be stored/reported by other systems
    • Format: TBD
  • statistics.power - Fanout exchange, messages pushed to this exchange indicate power statistics that can be stored/reported by other systems
    • Format: JSON, 'meter_id' key for what circuit or area is being metered (using standard lab electrical system identifiers), 'watts' for how many watts are in use at the time of reporting, 'cost' for cost per hour at the present time based on the wattage in use
  • statistics.occupancy - Fanout exchange, messages pushed to this exchange indicate which areas of the lab are occupied at the present time.
    • Format: JSON, 'area' for which area the report is for, 'occupied' for whether this area is presently occupied, 'last_detected' for the number of minutes ago movement was last detected in the area, 'change' for whether this is a change in the occupied status from the last report.
  • eight - Fanout exchange, messages sent to this exchange indicate the number 8 should be printed full-screen (white text on a black background) and/or announced verbally. See also: 8.
    • Format: {eight: 8}

Queues

Queues are named <exchange>.<service>, e.g. doorbot's door.entry queue would be is door.entry.doorbot.

Message Flow Diagram

<graphviz> digraph graphname {

 node [  style=filled fillcolor="papayawhip" ]
 
 "Building Door System" [shape=house style=filled fillcolor="palevioletred1"]
 "Building Power System" [shape=house style=filled fillcolor="palevioletred1"]
 "HackLab Power Monitor\npowermon" [shape=house style=filled fillcolor="palevioletred1"]
 "WiFi Occupancy Sensors" [shape=house style=filled fillcolor="palevioletred1"]
 "LED Sign\nsign0" [shape=house style=filled fillcolor="palevioletred1"]
 "Stats Sign\nsign1" [shape=house style=filled fillcolor="palevioletred1"]
 "External Physical System" [shape=house style=filled fillcolor="palevioletred1"]
 "exchange" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "door.entry" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "notification.general" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "notification.graphic" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "notification.text" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "statistics.power" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "statistics.bandwidth" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "statistics.occupancy" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "statistics.hvac" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 "eight" [shape=trapezium style=filled fillcolor="paleturquoise1"]
 
 "queue" [shape=box style=filled fillcolor="palegreen1"]
 "door.entry.twitter" [shape=box style=filled fillcolor="palegreen1"]
 "door.entry.notification" [shape=box style=filled fillcolor="palegreen1"]
 "notification.general.doorbot" [shape=box style=filled fillcolor="palegreen1"]
 "notification.general.ledsign" [shape=box style=filled fillcolor="palegreen1"]
 "notification.graphic.ledsign" [shape=box style=filled fillcolor="palegreen1"]
 "notification.text.ledsign" [shape=box style=filled fillcolor="palegreen1"]
 "statistics.power.statssign" [shape=box style=filled fillcolor="palegreen1"]
 "statistics.bandwidth.statssign" [shape=box style=filled fillcolor="palegreen1"]
 "statistics.power.graph" [shape=box style=filled fillcolor="palegreen1"]
 "statistics.occupancy.graph" [shape=box style=filled fillcolor="palegreen1"]
 "statistics.occupancy.hacktouch" [shape=box style=filled fillcolor="palegreen1"]
 "statistics.occupancy.hvac" [shape=box style=filled fillcolor="palegreen1"]
 "eight.signs" [shape=box style=filled fillcolor="palegreen1"]
 "External API" [shape=hexagon style=filled fillcolor="royalblue1"]
 "HTTP API\nTwitter" [shape=hexagon style=filled fillcolor="royalblue1"]
 "IRC #hacklabto (recv)" [shape=hexagon style=filled fillcolor="royalblue1"]
 "IRC #hacklabto (send)" [shape=hexagon style=filled fillcolor="royalblue1"]
 "HTTP API\nBAYweb Cloud HVAC" [shape=hexagon style=filled fillcolor="royalblue1"]
 "Service"
 "Building Door System" -> "HTTP Service\ncard_event" -> "door.entry"
 "door.entry" -> "door.entry.notification"
 "door.entry" -> "door.entry.twitter"
 "door.entry.notification" -> "doormsg_to_notification" -> "notification.general"
 "door.entry.twitter" -> "hacklab_door_tweeter" -> "HTTP API\nTwitter"
 "notification.general" -> "notification.general.doorbot"
 "notification.general" -> "notification.general.ledsign"
 "notification.general.doorbot" -> "doorbot (HacklabMQ)"
 "doorbot (HacklabMQ)" -> "IRC #hacklabto (send)"
 "notification.general.ledsign" -> "gennotification_sign_feeder";
 "gennotification_sign_feeder" -> "HTTP Service\nSign Text Renderer"
 "HTTP Service\nSign Text Renderer" -> bmix
 bmix -> "LED Sign\nsign0"
 "IRC #hacklabto (recv)" -> "doorbot (HacklabMQPublisher)"
 "doorbot (HacklabMQPublisher)" -> "notification.text" [ label="!sign" ]
 "notification.text" -> "notification.text.ledsign"
 "notification.text.ledsign" -> "ledsign_feeder"
 "ledsign_feeder" ->  "HTTP Service\nSign Text Renderer"
 
 "doorbot (HacklabMQPublisher)" -> "notification.graphic" [ label="*ostrich*" ]
 "notification.graphic" -> "notification.graphic.ledsign"
 "notification.graphic.ledsign" -> "ledsign_ostrich_feeder"
 "ledsign_ostrich_feeder" -> "bmix"
 "Building Power System" -> "HTTP Service\npowerdata" -> "statistics.power"
 "HackLab Power Monitor\npowermon" -> "powercollect" -> "statistics.power"
 "statistics.power" -> "statistics.power.statssign"
 "statistics.power.statssign" -> "statssignd"
 "statistics.power" -> "statistics.power.graph" -> "powergraph" -> "HTTP Frontend\nHackLab AMQP Graphs"
 "Firewall SNMP" -> "bandwidth_feeder" -> "statistics.bandwidth" 
 "statistics.bandwidth" -> "statistics.bandwidth.statssign"
 "statistics.bandwidth.statssign" -> "statssignd"
 
 "WiFi Occupancy Sensors" -> "occupancy_collector" -> "statistics.occupancy"
 "statistics.occupancy" -> "statistics.occupancy.graph" -> "occupancygraph" -> "HTTP Frontend\nHackLab AMQP Graphs"
 "statistics.occupancy" -> "statistics.occupancy.hacktouch" -> "hacktouch_occupancy_powersave"
 "statistics.occupancy" -> "statistics.occupancy.hvac" -> "hvac_occupancy_adjuster" -> "HTTP API\nBAYweb Cloud HVAC" 
 "HTTP API\nBAYweb Cloud HVAC" -> "hvac_stats_feeder" -> "statistics.hvac"
 "eight" -> "eight.signs"
 "eight.signs" -> "eight_feeder"
 "eight_feeder" -> "Stats Sign\nsign1"
 "eight_feeder" -> "HTTP Service\nSign Text Renderer"
 "statssignd" -> "Stats Sign\nsign1"

} </graphviz>