httpServer.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { PlatformConfig } from 'homebridge'
  2. import { domoticaPlatform } from './platform'
  3. const request = require("request")
  4. const http = require('http')
  5. const url = require('url')
  6. export class httpServer {
  7. private address
  8. private port
  9. constructor(
  10. private readonly platform: domoticaPlatform,
  11. private readonly config: PlatformConfig
  12. ) {
  13. this.address = "0.0.0.0"
  14. this.port = 8080
  15. }
  16. serverCallback (request, response) {
  17. var urlObject = url.parse(request.url, true)
  18. var urlQuery = urlObject.query
  19. var body: Uint8Array[] = []
  20. var log = this.platform.log
  21. request.on('error', (err) => {
  22. log.debug("[ERROR Homebridge Domotica HttpServer] Reason: %s.", err)
  23. }).on('data', (chunk) => {
  24. body.push(chunk)
  25. }).on('end', () => {
  26. var bodyString = Buffer.concat(body).toString()
  27. response.on('error', function(err) {
  28. log.debug("[ERROR Homebridge Domotica HttpServer] Reason: %s.", err)
  29. })
  30. response.statusCode = 200
  31. response.setHeader('Content-Type', 'application/json')
  32. if (!urlQuery.type || !urlQuery.typeId) {
  33. response.statusCode = 404
  34. response.setHeader("Content-Type", "text/plain")
  35. var errorText = "[ERROR Homebridge Domotica HttpServer] Type or TypeId missing in request."
  36. response.write(errorText)
  37. response.end()
  38. } else {
  39. var type = urlQuery.type
  40. var typeId = urlQuery.typeId
  41. if (type != "PowerSocket" && type != "PowerSwitch" && type != "Xiaomi" && type != "Camera") {
  42. log.debug(request.url)
  43. }
  44. if (type == "Xiaomi") {
  45. type = urlQuery.model
  46. if (type == "TemperatureHumiditySensor") {
  47. type = "EnvironmentSensor"
  48. }
  49. }
  50. var foundAccessory
  51. for (const accessory of this.platform.accessories) {
  52. if (accessory.type == type && accessory.typeId == typeId) {
  53. foundAccessory = accessory
  54. break
  55. }
  56. }
  57. if (foundAccessory) {
  58. for (const key of Object.keys(urlQuery)) {
  59. if (key != "type" && key != "typeId") {
  60. foundAccessory.setValue(key, urlQuery[key])
  61. }
  62. }
  63. var responseBody = { "success" : true };
  64. response.write(JSON.stringify(responseBody))
  65. response.end()
  66. } else {
  67. response.setHeader("Content-Type", "text/plain")
  68. errorText = "[ERROR Homebridge Domotica HttpServer] " + type + " " + typeId + " not found."
  69. if (type != "PowerSocket") {
  70. log.debug(errorText + '(' + request.url + ')')
  71. }
  72. response.write(errorText)
  73. response.end()
  74. }
  75. }
  76. })
  77. }
  78. start() {
  79. http.createServer(this.serverCallback.bind(this)).listen(this.port, this.address)
  80. }
  81. }