Итак, для начала попробуем использовать пример с демо. Ищем свой yahoo woeid.
Пишем в sitemap :
Frame label="Погода" { Text item=Yahoo_Temperature { Frame { Text item=Yahoo_Temp_Max Text item=Yahoo_Temp_Min } Frame { Chart item=Yahoo_Chart period=h refresh=10000 } } }
Пишем в items :
Group Yahoo_Chart (Weather) Number Yahoo_Temperature "Температура на улице yahoo [%.1f °C]" <temperature> (Yahoo_Chart) { http="<[http://weather.yahooapis.com/forecastrss?w=_тут ваш woeid_&u=c:60000:XSLT(yahoo_weather_temperature.xsl)]" } Number Yahoo_Temp_Max "Сегодня максимум [%.1f °C]" <temperature> (Yahoo_Chart) Number Yahoo_Temp_Min "Сегодня минимум [%.1f °C]" <temperature> (Yahoo_Chart)
Загляните в yahoo_weather_temperature.xsl - это шаблон для извлечения данных из возращенного xml.
Сейчас мы видим, что item Yahoo_Temp_Max и Yahoo_Temp_Min не привязаны к источнику данных. Откуда же их брать? Смотрим demo.rules, а также документацию здесь и прописываем себе тоже в файл home.rules:
import org.openhab.core.library.types.* import org.openhab.core.persistence.* import org.openhab.model.script.actions.* rule "Update max and min temperatures" when Item Yahoo_Temperature changed or Time cron "0 0 0 * * ?" or System started then postUpdate(Yahoo_Temp_Max, Yahoo_Temperature.maximumSince(now.toDateMidnight).state) postUpdate(Yahoo_Temp_Min, Yahoo_Temperature.minimumSince(now.toDateMidnight).state) end
Ну и последнее, сохранение. Добавим в rrd4j.persist:
Weather*, PersistTemp* : strategy = everyMinute, restoreOnStartupПерезапускаем сервер и я получил ошибку в логах:
Executing startup rule 'Startup' 22:32:27.859 ERROR o.e.x.x.s.XbaseScopeProvider[:189]- error during scoping com.google.inject.ProvisionException: Guice provision errors: 1) Error injecting constructor, java.lang.NullPointerException: null key
Ошибка решается установкой Oracle Java.
Удаляем OpenJDK, устанавливаем Oracle Java (инсталлер качает oracel java с интеренета).
# /etc/init.d/openhab stop # apt-get remove icedtea-6-jre-jamvm # apt-get autoremove # echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list # echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list # apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 # apt-get update # apt-get install oracle-java7-installer # java -version java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode)
Вчера настроил yahoo, а сегодня сервер мне уже показывает вместо -20C реальных: -2C. Поэтому я решил не использовать погоду от yahoo. Решил добавить gismeteo, openweathermap.org и worldweatheronline.net и вычислить среднее арифметическое с показаний. Забирать температуру буду раз в полчаса, чтобы не нагружать сервер.
В общем-то, имея демо, несложно написать следующий сценарий, который пришел мне в голову (в скобках, какая часть конфигурации отвечает за действие).
- Запрашиваем данные раз в полчаса с трех источников (чаще нет смысла - их обычно обновляют раз в три часа). (items)
- Сохраняем данные раз в полчаса с каждого ресурса. (persist)
- Вычисляем среднюю температуру после обновления хотя бы одного источника (rules)
- Вычисляем максимальную и минимальную температуру после обновления средней температуры (rules)
- Сохраняем среднюю, максимальную и минимальную температуру при их обновлении (everyChange в persist)
- Выводим среднюю температуру, а также график средней, минимальной и максимальной (аналогично как в демо)
Update.
rrdDef.addArchive(function, 0.5, 4, 360); // one day (granularity 4 min) rrdDef.addArchive(function, 0.5, 15, 644); // one week (granularity 15 min) rrdDef.addArchive(function, 0.5, 60, 720); // one month (granularity 1 hour) rrdDef.addArchive(function, 0.5, 720, 730); // one year (granularity 12 hours) rrdDef.addArchive(function, 0.5, 10080, 520); // ten years (granularity 7 days)
То есть, после первого дня хранения, точность данных меняется на 4 минуты, после одной недели на 15 минут, одного месяца на на 1 час и так далее...
В принципе, все шаги очевидны, единственно, я немного затормозил на этапе вычисления средней температуры. Значения надо предварительно перевести в DecimalType:
rule "Update average temp" when Item Owm_Temperature changed or Item Gismeteo_Temperature changed or Item Wwo_Temperature changed or System started then var Number owm = Owm_Temperature.state as DecimalType var Number gismeteo = Gismeteo_Temperature.state as DecimalType var Number wwo = Wwo_Temperature.state as DecimalType postUpdate( Average_Temperature, ( owm + gismeteo + wwo ) / 3 ) end
ps. Заодно поменяем ntp сервер для даты в файле конфигурации. Я люблю pool.ntp.org.
Привет. Прошу помочь добавить в openhab данные о температуре и влажности из этой коробочки http://www.noo.com.by/Ethernet_PR1132.html.
ОтветитьУдалитьОтдает она xml файл http://192.168.1.5/sens.xml содержания:
27,0
53
0
-
-
1
-
-
1
-
-
1
Как-то надо сделать запрос с его обработкой.
Спасибо!
Сожрало xml разметку
ОтветитьУдалитьссылка на xml https://dl.dropboxusercontent.com/u/4094156/sens.xml
ОтветитьУдалитьhttps://github.com/openhab/openhab/blob/master/distribution/openhabhome/configurations/transform/yahoo_weather_temperature.xsl
Удалитьhttps://github.com/openhab/openhab/wiki/Samples-XSLT-Transformations
http://www.w3schools.com/xsl/default.asp
полистайте и поймете как сделать шаблон
xslt шаблон сделал, как сам запрос передать?
ОтветитьУдалитьNumber My_Temperature "Outside Temperature [%.1f °C]" (Weather_Chart) { http="<[http://192.168.1.5/sens.xml:XSLT(weather_temperature.xsl)]" }
Не работает.
https://github.com/openhab/openhab/wiki/Http-Binding
Удалитьвы пропустили параметр refreshintervalinmilliseconds - он обязателен
Не поделитесь кодом, который вынимает данные с GISMETEO?
ОтветитьУдалитькубитрак в гараже с конфигами. :(
Удалитьurl по-моему типа
http://informer.gismeteo.ru/rss/27612.xml
на основе этого шаблона https://github.com/openhab/openhab/blob/master/distribution/openhabhome/configurations/transform/yahoo_weather_temperature.xsl
просто поправить чуть чуть
справка по xls разметке http://www.w3schools.com/xsl/default.asp