openapi: 3.0.3 info: title: P810 REST API v1 version: "1.0.0" description: > API REST v1 do P810. Quando a autenticação da API estiver habilitada, use Authorization: Bearer . Token READ permite GET. Token WRITE permite GET e POST. servers: - url: http://192.168.17.51 description: P810 local tags: - name: System - name: Outputs - name: DateTime - name: Watchdogs - name: Schedules paths: /api/v1/health: get: summary: Estado geral do dispositivo tags: [System] security: [{BearerAuth: []}] responses: "200": description: Estado geral content: application/json: schema: {$ref: "#/components/schemas/HealthResponse"} example: {ok: true, status: ok, uptime_s: 12345} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} options: summary: CORS preflight tags: [System] responses: "204": {description: No Content} /api/v1/info: get: summary: Informações do dispositivo tags: [System] security: [{BearerAuth: []}] responses: "200": description: Informações do P810 content: application/json: schema: {$ref: "#/components/schemas/InfoResponse"} example: {ok: true, model: P810, firmware: "1.0.0"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} options: summary: CORS preflight tags: [System] responses: "204": {description: No Content} /api/v1/reboot: post: summary: Reinicia o dispositivo description: Requer token WRITE. tags: [System] security: [{BearerAuth: []}] responses: "200": description: Reboot agendado content: application/json: schema: {$ref: "#/components/schemas/RebootResponse"} example: {ok: true, message: Reboot scheduled} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ForbiddenOrDisabled"} "500": {$ref: "#/components/responses/InternalError"} options: summary: CORS preflight tags: [System] responses: "204": {description: No Content} /api/v1/outputs: get: summary: Lista o estado das saídas description: Requer token READ ou WRITE. tags: [Outputs] security: [{BearerAuth: []}] responses: "200": description: Lista de saídas content: application/json: schema: {$ref: "#/components/schemas/OutputsResponse"} example: ok: true outputs: - {id: 1, tag: plug01, name: Tomada 1, active: 1, state: 1} - {id: 2, tag: plug02, name: Tomada 2, active: 1, state: 0} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} options: summary: CORS preflight tags: [Outputs] responses: "204": {description: No Content} /api/v1/output/{id}: get: summary: Lê uma saída específica description: Requer token READ ou WRITE. tags: [Outputs] security: [{BearerAuth: []}] parameters: - {$ref: "#/components/parameters/OutputId"} responses: "200": description: Estado da saída content: application/json: schema: {$ref: "#/components/schemas/OutputResponse"} example: {ok: true, id: 1, tag: plug01, name: Tomada 1, active: 1, state: 1} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} post: summary: Ajusta uma saída específica description: Requer token WRITE. tags: [Outputs] security: [{BearerAuth: []}] parameters: - {$ref: "#/components/parameters/OutputId"} requestBody: required: true content: application/json: schema: {$ref: "#/components/schemas/OutputSetRequest"} example: {state: 1} responses: "200": description: Saída ajustada content: application/json: schema: {$ref: "#/components/schemas/OutputResponse"} example: {ok: true, id: 1, state: 1} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ForbiddenOrDisabled"} options: summary: CORS preflight tags: [Outputs] parameters: - {$ref: "#/components/parameters/OutputId"} responses: "204": {description: No Content} /api/v1/datetime: get: summary: Lê a data/hora atual description: Requer token READ ou WRITE. tags: [DateTime] security: [{BearerAuth: []}] responses: "200": description: Data/hora atual content: application/json: schema: {$ref: "#/components/schemas/DateTimeResponse"} example: {ok: true, datetime: "04/07/2026 15:30:00", epoch: 1783193400} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} post: summary: Ajusta a data/hora description: Requer token WRITE. tags: [DateTime] security: [{BearerAuth: []}] requestBody: required: true content: application/json: schema: {$ref: "#/components/schemas/DateTimeSetRequest"} example: {year: 2026, mon: 7, day: 4, hour: 15, min: 30, sec: 0} responses: "200": description: Data/hora ajustada content: application/json: schema: {$ref: "#/components/schemas/DateTimeResponse"} example: {ok: true, datetime: "04/07/2026 15:30:00", epoch: 1783193400} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ForbiddenOrDisabled"} "500": {$ref: "#/components/responses/InternalError"} options: summary: CORS preflight tags: [DateTime] responses: "204": {description: No Content} /api/v1/watchdogs: get: summary: Lista os watchdogs disponíveis description: Requer token READ ou WRITE. tags: [Watchdogs] security: [{BearerAuth: []}] responses: "200": description: Lista de watchdogs content: application/json: schema: {$ref: "#/components/schemas/WatchdogsListResponse"} example: ok: true count: 8 watchdogs: - {id: 1, tag: watchdog01} - {id: 2, tag: watchdog02} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} options: summary: CORS preflight tags: [Watchdogs] responses: "204": {description: No Content} /api/v1/watchdog/{id}: get: summary: Lê a configuração de um watchdog description: Requer token READ ou WRITE. tags: [Watchdogs] security: [{BearerAuth: []}] parameters: - {$ref: "#/components/parameters/WatchdogId"} responses: "200": description: Configuração do watchdog content: application/json: schema: {$ref: "#/components/schemas/WatchdogResponse"} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} post: summary: Atualiza a configuração de um watchdog description: Requer token WRITE. tags: [Watchdogs] security: [{BearerAuth: []}] parameters: - {$ref: "#/components/parameters/WatchdogId"} requestBody: required: true content: application/json: schema: {$ref: "#/components/schemas/WatchdogUpdateRequest"} example: host: "192.168.1.20" plug: plug01 active: 1 ping_interval: 5 ping_timeout: 50 ping_fail_limit: 3 time_plug_off: 10 time_monitor_off: 10 retry_limit: 0 retry_long_time: 60 responses: "200": description: Configuração atualizada content: application/json: schema: {$ref: "#/components/schemas/WatchdogResponse"} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ForbiddenOrDisabled"} "500": {$ref: "#/components/responses/InternalError"} options: summary: CORS preflight tags: [Watchdogs] parameters: - {$ref: "#/components/parameters/WatchdogId"} responses: "204": {description: No Content} /api/v1/schedules: get: summary: Lista as agendas disponíveis description: Requer token READ ou WRITE. tags: [Schedules] security: [{BearerAuth: []}] responses: "200": description: Lista de agendas content: application/json: schema: {$ref: "#/components/schemas/SchedulesListResponse"} example: ok: true count: 8 schedules: - {id: 1, tag: schedule01} - {id: 2, tag: schedule02} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} options: summary: CORS preflight tags: [Schedules] responses: "204": {description: No Content} /api/v1/schedule/{id}: get: summary: Lê a configuração de uma agenda description: Requer token READ ou WRITE. tags: [Schedules] security: [{BearerAuth: []}] parameters: - {$ref: "#/components/parameters/ScheduleId"} responses: "200": description: Configuração da agenda content: application/json: schema: {$ref: "#/components/schemas/ScheduleResponse"} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ApiDisabled"} post: summary: Atualiza a configuração de uma agenda description: Requer token WRITE. tags: [Schedules] security: [{BearerAuth: []}] parameters: - {$ref: "#/components/parameters/ScheduleId"} requestBody: required: true content: application/json: schema: {$ref: "#/components/schemas/ScheduleUpdateRequest"} example: plug: plug01 active: 1 sun_on: "00:00" sun_off: "00:00" mon_on: "08:00" mon_off: "18:00" tue_on: "08:00" tue_off: "18:00" wed_on: "08:00" wed_off: "18:00" thu_on: "08:00" thu_off: "18:00" fri_on: "08:00" fri_off: "18:00" sat_on: "00:00" sat_off: "00:00" responses: "200": description: Configuração atualizada content: application/json: schema: {$ref: "#/components/schemas/ScheduleResponse"} "400": {$ref: "#/components/responses/BadRequest"} "401": {$ref: "#/components/responses/Unauthorized"} "403": {$ref: "#/components/responses/ForbiddenOrDisabled"} "500": {$ref: "#/components/responses/InternalError"} options: summary: CORS preflight tags: [Schedules] parameters: - {$ref: "#/components/parameters/ScheduleId"} responses: "204": {description: No Content} components: securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: Token parameters: OutputId: name: id in: path required: true schema: {type: integer, minimum: 1, maximum: 8} example: 1 WatchdogId: name: id in: path required: true schema: {type: integer, minimum: 1, maximum: 8} example: 1 ScheduleId: name: id in: path required: true schema: {type: integer, minimum: 1, maximum: 8} example: 1 responses: BadRequest: description: Requisição inválida content: application/json: schema: {$ref: "#/components/schemas/ErrorResponse"} example: {ok: false, code: bad_request, message: Requisição inválida.} Unauthorized: description: Token ausente ou inválido headers: WWW-Authenticate: schema: {type: string} example: Bearer content: application/json: schema: {$ref: "#/components/schemas/AuthErrorResponse"} examples: missing: {value: {ok: false, error: missing_bearer_token}} invalid: {value: {ok: false, error: invalid_token}} ApiDisabled: description: API desabilitada na configuração do dispositivo content: application/json: schema: {$ref: "#/components/schemas/AuthErrorResponse"} example: {ok: false, error: api_disabled} ForbiddenOrDisabled: description: Token sem permissão para escrita ou API desabilitada content: application/json: schema: {$ref: "#/components/schemas/AuthErrorResponse"} examples: write_token_required: {value: {ok: false, error: write_token_required}} api_disabled: {value: {ok: false, error: api_disabled}} InternalError: description: Falha interna content: application/json: schema: {$ref: "#/components/schemas/ErrorResponse"} example: {ok: false, code: internal_error, message: Falha interna.} schemas: ErrorResponse: type: object properties: ok: {type: boolean, example: false} code: {type: string, example: bad_request} message: {type: string, example: Requisição inválida.} AuthErrorResponse: type: object properties: ok: {type: boolean, example: false} error: {type: string, example: invalid_token} HealthResponse: type: object properties: ok: {type: boolean, example: true} status: {type: string, example: ok} uptime_s: {type: integer, example: 12345} InfoResponse: type: object properties: ok: {type: boolean, example: true} model: {type: string, example: P810} firmware: {type: string, example: "1.0.0"} RebootResponse: type: object properties: ok: {type: boolean, example: true} message: {type: string, example: Reboot scheduled} OutputItem: type: object properties: id: {type: integer, minimum: 1, maximum: 8, example: 1} tag: {type: string, example: plug01} name: {type: string, example: Tomada 1} active: {type: integer, enum: [0, 1], example: 1} state: {type: integer, enum: [0, 1], example: 0} OutputsResponse: type: object properties: ok: {type: boolean, example: true} outputs: type: array items: {$ref: "#/components/schemas/OutputItem"} OutputSetRequest: type: object required: [state] properties: state: {type: integer, enum: [0, 1], example: 1} OutputResponse: allOf: - type: object properties: ok: {type: boolean, example: true} - {$ref: "#/components/schemas/OutputItem"} DateTimeSetRequest: type: object required: [year, mon, day, hour, min, sec] properties: year: {type: integer, minimum: 1970, maximum: 9999, example: 2026} mon: {type: integer, minimum: 1, maximum: 12, example: 7} day: {type: integer, minimum: 1, maximum: 31, example: 4} hour: {type: integer, minimum: 0, maximum: 23, example: 15} min: {type: integer, minimum: 0, maximum: 59, example: 30} sec: {type: integer, minimum: 0, maximum: 59, example: 0} DateTimeResponse: type: object properties: ok: {type: boolean, example: true} datetime: {type: string, example: "04/07/2026 15:30:00"} epoch: {type: integer, example: 1783193400} TagItem: type: object properties: id: {type: integer, minimum: 1, maximum: 8, example: 1} tag: {type: string, example: watchdog01} WatchdogsListResponse: type: object properties: ok: {type: boolean, example: true} count: {type: integer, example: 8} watchdogs: type: array items: {$ref: "#/components/schemas/TagItem"} WatchdogUpdateRequest: type: object required: [host, plug, active, ping_interval, ping_timeout, ping_fail_limit, time_plug_off, time_monitor_off, retry_limit, retry_long_time] properties: host: {type: string, example: "192.168.1.20"} plug: {type: string, example: plug01} active: {type: integer, enum: [0, 1], example: 1} ping_interval: {type: integer, minimum: 1, example: 5} ping_timeout: {type: integer, minimum: 1, example: 50} ping_fail_limit: {type: integer, minimum: 1, example: 3} time_plug_off: {type: integer, minimum: 1, example: 10} time_monitor_off: {type: integer, minimum: 0, example: 10} retry_limit: {type: integer, minimum: 0, example: 0} retry_long_time: {type: integer, minimum: 0, example: 60} WatchdogResponse: allOf: - type: object properties: ok: {type: boolean, example: true} id: {type: integer, example: 1} tag: {type: string, example: watchdog01} - {$ref: "#/components/schemas/WatchdogUpdateRequest"} ScheduleTagItem: type: object properties: id: {type: integer, minimum: 1, maximum: 8, example: 1} tag: {type: string, example: schedule01} SchedulesListResponse: type: object properties: ok: {type: boolean, example: true} count: {type: integer, example: 8} schedules: type: array items: {$ref: "#/components/schemas/ScheduleTagItem"} TimeHHMM: type: string pattern: "^([01][0-9]|2[0-3]):[0-5][0-9]$" example: "08:00" ScheduleUpdateRequest: type: object required: [plug, active, sun_on, sun_off, mon_on, mon_off, tue_on, tue_off, wed_on, wed_off, thu_on, thu_off, fri_on, fri_off, sat_on, sat_off] properties: plug: {type: string, example: plug01} active: {type: integer, enum: [0, 1], example: 1} sun_on: {$ref: "#/components/schemas/TimeHHMM"} sun_off: {$ref: "#/components/schemas/TimeHHMM"} mon_on: {$ref: "#/components/schemas/TimeHHMM"} mon_off: {$ref: "#/components/schemas/TimeHHMM"} tue_on: {$ref: "#/components/schemas/TimeHHMM"} tue_off: {$ref: "#/components/schemas/TimeHHMM"} wed_on: {$ref: "#/components/schemas/TimeHHMM"} wed_off: {$ref: "#/components/schemas/TimeHHMM"} thu_on: {$ref: "#/components/schemas/TimeHHMM"} thu_off: {$ref: "#/components/schemas/TimeHHMM"} fri_on: {$ref: "#/components/schemas/TimeHHMM"} fri_off: {$ref: "#/components/schemas/TimeHHMM"} sat_on: {$ref: "#/components/schemas/TimeHHMM"} sat_off: {$ref: "#/components/schemas/TimeHHMM"} ScheduleResponse: allOf: - type: object properties: ok: {type: boolean, example: true} id: {type: integer, example: 1} tag: {type: string, example: schedule01} - {$ref: "#/components/schemas/ScheduleUpdateRequest"}