using System; using System.Collections.Generic; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using System.Text.Json; using System.Threading.Tasks; using ZaoBot.Config; namespace ZaoBot.OpenHab { class OpenHabClient { private string url; private string token = ""; HttpClient http = new HttpClient(); public OpenHabClient(IConfig config) { this.url = config.Data.RootElement.GetProperty("openhab_url").GetString(); if (!string.IsNullOrEmpty(token)) { http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token + ":"); } } public async Task GetItemState(string item) { var result = await http.GetAsync(url + "/rest/items/" + item); var content = await result.Content.ReadAsStringAsync(); return ParseState(content); } private ItemState ParseState(string content) { var doc = JsonDocument.Parse(content); var pattern = ""; JsonElement stateDescription; if (doc.RootElement.TryGetProperty("stateDescription", out stateDescription)) { pattern = stateDescription.GetProperty("pattern").GetString(); } var result = new ItemState() { state = doc.RootElement.GetProperty("state").GetString(), pattern = pattern, }; return result; } public async Task PostItemState(string item, string state) { return await Post(url + "/rest/items/" + item, state); } private async Task Post(string url, string v) { var content = new ByteArrayContent(Encoding.UTF8.GetBytes(v)); content.Headers.Add("Content-Type", "text/plain"); var result = await http.PostAsync(url, content); if (result.IsSuccessStatusCode) return "OK"; else return "Fail. " + result.ReasonPhrase; } public async Task> GetItems() { var result = await http.GetAsync(url + "/rest/items/?fields=name,type,label"); var content = await result.Content.ReadAsStringAsync(); var doc = JsonDocument.Parse(content); var items = new List(); foreach (var element in doc.RootElement.EnumerateArray()) { var label = ""; JsonElement l; if (element.TryGetProperty("label", out l)) { label = l.GetString(); } items.Add(new Item() { name = element.GetProperty("name").GetString(), type = element.GetProperty("type").GetString(), label = label, }); } return items; } } }