11_OWDevice.pm 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066
  1. # $Id: 11_OWDevice.pm 13114 2017-01-16 19:25:59Z neubert $
  2. ##############################################################################
  3. #
  4. # 11_OWDevice.pm
  5. # Copyright by Dr. Boris Neubert & Martin Fischer
  6. # e-mail: omega at online dot de
  7. # e-mail: m_fischer at gmx dot de
  8. #
  9. # This file is part of fhem.
  10. #
  11. # Fhem is free software: you can redistribute it and/or modify
  12. # it under the terms of the GNU General Public License as published by
  13. # the Free Software Foundation, either version 2 of the License, or
  14. # (at your option) any later version.
  15. #
  16. # Fhem is distributed in the hope that it will be useful,
  17. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. # GNU General Public License for more details.
  20. #
  21. # You should have received a copy of the GNU General Public License
  22. # along with fhem. If not, see <http://www.gnu.org/licenses/>.
  23. #
  24. ##############################################################################
  25. package main;
  26. use strict;
  27. use warnings;
  28. no if $] >= 5.017011, warnings => 'experimental::smartmatch';
  29. use vars qw(%owdevice);
  30. # 1-Wire devices (order by family code)
  31. # http://owfs.sourceforge.net/family.html
  32. $owdevice{"01"} = {
  33. # DS2401 - Silicon Serial Number
  34. # DS1990A - Serial Number iButton
  35. "read" => [],
  36. "write" => [],
  37. "poll" => [ qw(id) ],
  38. "state" => [],
  39. "interface" => "id",
  40. };
  41. $owdevice{"05"} = {
  42. # DS2405 - Addressable Switch
  43. "read" => [ qw(PIO sensed) ],
  44. "write" => [ qw(PIO) ],
  45. "poll" => [ qw(sensed) ],
  46. "state" => [ qw(sensed) ],
  47. "event" => { qw(0 closed 1 opened) },
  48. "interface" => "state",
  49. };
  50. $owdevice{"10"} = {
  51. # DS18S20 - High-Precision 1-Wire Digital Thermometer
  52. # DS1920 - iButton version of the thermometer
  53. "read" => [ qw(power),
  54. qw(temperature templow temphigh) ],
  55. "write" => [ qw(templow temphigh) ],
  56. "poll" => [ qw(temperature) ],
  57. "state" => [ qw(temperature) ],
  58. "alarm" => 1,
  59. "interface" => "temperature",
  60. };
  61. $owdevice{"12"} = {
  62. # DS2406, DS2407 - Dual Addressable Switch with 1kbit Memory
  63. "read" => [ qw(channels),
  64. qw(latch.A latch.B latch.ALL latch.BYTE),
  65. qw(memory),
  66. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.ALL),
  67. qw(PIO.A PIO.B PIO.ALL PIO.BYTE),
  68. qw(power),
  69. qw(sensed.A sensed.B sensed.ALL sensed.BYTE),
  70. qw(set_alarm),
  71. qw(TAI8570/pressure TAI8570/sibling TAI8570/temperature),
  72. qw(T8A/volt.0 T8A/volt.1 T8A/volt.2 T8A/volt.3 T8A/volt.4 T8A/volt.5 T8A/volt.6),
  73. qw(T8A/volt.7 T8A/volt.ALL) ],
  74. "write" => [ qw(latch.A latch.B latch.ALL latch.BYTE),
  75. qw(memory),
  76. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.ALL),
  77. qw(PIO.A PIO.B PIO.ALL PIO.BYTE),
  78. qw(sensed.A sensed.B sensed.ALL sensed.BYTE),
  79. qw(set_alarm), ],
  80. "poll" => [ qw(sensed.A sensed.B) ],
  81. "state" => [ qw(sensed.A sensed.B) ],
  82. "alarm" => 1,
  83. "event" => { qw(0 off 1 on) },
  84. "interface" => "state",
  85. };
  86. $owdevice{"1B"} = {
  87. # DS2436 - Battery ID/Monitor Chip
  88. "read" => [ qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4 pages/page.ALL),
  89. qw(temperature),
  90. qw(volts),
  91. qw(counter/cycles) ],
  92. "write" => [ qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4 pages/page.ALL),
  93. qw(counter/increment counter/reset) ],
  94. "poll" => [ qw(temperature volts counter/cycles) ],
  95. "state" => [ qw(temperature volts counter/cycles) ],
  96. "interface" => "multisensor",
  97. };
  98. $owdevice{"1D"} = {
  99. # DS2423 - 4kbit 1-Wire RAM with Counter
  100. "read" => [ qw(counters.A counters.B counters.ALL),
  101. qw(memory),
  102. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4 pages/page.5),
  103. qw(pages/page.6 pages/page.7 pages/page.8 pages/page.9 pages/page.10 pages/page.11),
  104. qw(pages/page.12 pages/page.13 pages/page.14 pages/page.15),
  105. qw(pages/count.0 pages/count.1 pages/count.2 pages/count.3 pages/count.4 pages/count.5),
  106. qw(pages/count.6 pages/count.7 pages/count.8 pages/count.9 pages/count.10 pages/count.11),
  107. qw(pages/count.12 pages/count.13 pages/count.14 pages/count.15) ],
  108. "write" => [ qw(memory),
  109. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4 pages/page.5),
  110. qw(pages/page.6 pages/page.7 pages/page.8 pages/page.9 pages/page.10 pages/page.11),
  111. qw(pages/page.12 pages/page.13 pages/page.14 pages/page.15) ],
  112. "poll" => [ qw(counters.A counters.B) ],
  113. "state" => [ qw(counters.A counters.B) ],
  114. "offset" => [ qw(counters.A counters.B) ],
  115. "interface" => "counter",
  116. };
  117. $owdevice{"20"} = {
  118. # DS2450 - Quad A/D Converter
  119. "read" => [ qw(alarm/high.A alarm/high.B alarm/high.C alarm/high.D alarm/high.ALL),
  120. qw(alarm/low.A alarm/low.B alarm/low.C alarm/low.D alarm/low.ALL),
  121. qw(memory),
  122. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.ALL),
  123. qw(PIO.A PIO.B PIO.C PIO.D PIO.ALL),
  124. qw(power),
  125. qw(set_alarm/high.A set_alarm/high.B set_alarm/high.C set_alarm/high.D set_alarm/high.ALL),
  126. qw(set_alarm/low.A set_alarm/low.B set_alarm/low.C set_alarm/low.D set_alarm/low.ALL),
  127. qw(set_alarm/volthigh.A set_alarm/volthigh.B set_alarm/volthigh.C set_alarm/volthigh.D),
  128. qw(set_alarm/volthigh.ALL),
  129. qw(set_alarm/volt2high.A set_alarm/volt2high.B set_alarm/volt2high.C set_alarm/volt2high.D),
  130. qw(set_alarm/volt2high.ALL),
  131. qw(set_alarm/voltlow.A set_alarm/voltlow.B set_alarm/voltlow.C set_alarm/voltlow.D),
  132. qw(set_alarm/voltlow.ALL),
  133. qw(set_alarm/volt2low.A set_alarm/volt2low.B set_alarm/volt2low.C set_alarm/volt2low.D),
  134. qw(set_alarm/volt2low.ALL),
  135. qw(set_alarm/unset),
  136. qw(volt.A volt.B volt.C volt.D volt.ALL),
  137. qw(8bit/volt.A 8bit/volt.B 8bit/volt.C 8bit/volt.D 8bit/volt.ALL),
  138. qw(volt2.A volt2.B volt2.C volt2.D volt2.ALL),
  139. qw(8bit/volt2.A 8bit/volt2.B 8bit/volt2.C 8bit/volt2.D 8bit/volt2.ALL),
  140. qw(CO2/power CO2/ppm CO2/status) ],
  141. "write" => [ qw(alarm/high.A alarm/high.B alarm/high.C alarm/high.D alarm/high.ALL),
  142. qw(alarm/low.A alarm/low.B alarm/low.C alarm/low.D alarm/low.ALL),
  143. qw(memory),
  144. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.ALL),
  145. qw(PIO.A PIO.B PIO.C PIO.D PIO.ALL),
  146. qw(power),
  147. qw(set_alarm/high.A set_alarm/high.B set_alarm/high.C set_alarm/high.D set_alarm/high.ALL),
  148. qw(set_alarm/low.A set_alarm/low.B set_alarm/low.C set_alarm/low.D set_alarm/low.ALL),
  149. qw(set_alarm/volthigh.A set_alarm/volthigh.B set_alarm/volthigh.C set_alarm/volthigh.D),
  150. qw(set_alarm/volthigh.ALL),
  151. qw(set_alarm/volt2high.A set_alarm/volt2high.B set_alarm/volt2high.C set_alarm/volt2high.D),
  152. qw(set_alarm/volt2high.ALL),
  153. qw(set_alarm/voltlow.A set_alarm/voltlow.B set_alarm/voltlow.C set_alarm/voltlow.D),
  154. qw(set_alarm/voltlow.ALL),
  155. qw(set_alarm/volt2low.A set_alarm/volt2low.B set_alarm/volt2low.C set_alarm/volt2low.D),
  156. qw(set_alarm/volt2low.ALL),
  157. qw(set_alarm/unset) ],
  158. "poll" => [ qw(PIO.A PIO.B PIO.C PIO.D),
  159. qw(volt.A volt.B volt.C volt.D),
  160. qw(volt2.A volt2.B volt2.C volt2.D) ],
  161. "state" => [ qw(PIO.A PIO.B PIO.C PIO.D),
  162. qw(volt.A volt.B volt.C volt.D),
  163. qw(volt2.A volt2.B volt2.C volt2.D) ],
  164. "event" => { qw(0 off 1 on) },
  165. "interface" => "multisensor",
  166. };
  167. $owdevice{"22"} = {
  168. # DS1822 - Econo 1-Wire Digital Thermometer
  169. "read" => [ qw(temperature temperature9 temperature10 temperature11 temperature12 fasttemp),
  170. qw(temphigh templow),
  171. qw(power) ],
  172. "write" => [ qw(temphigh templow) ],
  173. "poll" => [ qw(temperature) ],
  174. "state" => [ qw(temperature) ],
  175. "alarm" => 1,
  176. "interface" => "temperature",
  177. };
  178. $owdevice{"23"} = {
  179. # DS2433 - 4kbit 1-Wire RAM
  180. "read" => [ qw(memory),
  181. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4 pages/page.5),
  182. qw(pages/page.6 pages/page.7 pages/page.8 pages/page.9 pages/page.10 pages/page.11),
  183. qw(pages/page.12 pages/page.13 pages/page.14 pages/page.15) ],
  184. "write" => [ qw(memory),
  185. qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4 pages/page.5),
  186. qw(pages/page.6 pages/page.7 pages/page.8 pages/page.9 pages/page.10 pages/page.11),
  187. qw(pages/page.12 pages/page.13 pages/page.14 pages/page.15) ],
  188. "poll" => [ qw(id) ],
  189. "state" => [ ],
  190. "interface" => "multisensor",
  191. };
  192. $owdevice{"24"} = {
  193. # DS2415 - 1-Wire Time Chip
  194. # DS1904 - RTC iButton
  195. "read" => [ qw(date flags running udate) ],
  196. "write" => [ qw(date flags running udate) ],
  197. "poll" => [ qw(date running udate) ],
  198. "state" => [ qw(date running) ],
  199. "interface" => "timer",
  200. };
  201. $owdevice{"26"} = {
  202. # DS2438 - Smart Battery Monitor
  203. "read" => [ qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4),
  204. qw(pages/page.5 pages/page.6 pages/page.7 pages/page.ALL),
  205. qw(temperature),
  206. qw(VAD VDD),
  207. qw(vis),
  208. qw(CA),
  209. qw(EE),
  210. qw(IAD),
  211. qw(date),
  212. qw(disconnect/date disconnect/udate),
  213. qw(endcharge/date endcharge/udate),
  214. qw(udate),
  215. qw(HIH4000/humidity),
  216. qw(HTM1735/humidity),
  217. qw(DATANAB/humidity),
  218. qw(humidity),
  219. qw(B1-R1-A/pressure B1-R1-A/gain B1-R1-A/offset),
  220. qw(S3-R1-A/current S3-R1-A/illumination S3-R1-A/gain),
  221. qw(MultiSensor/type),
  222. qw(offset) ],
  223. "write" => [ qw(pages/page.0 pages/page.1 pages/page.2 pages/page.3 pages/page.4),
  224. qw(pages/page.5 pages/page.6 pages/page.7 pages/page.ALL),
  225. qw(CA),
  226. qw(EE),
  227. qw(IAD),
  228. qw(date),
  229. qw(disconnect/date disconnect/udate),
  230. qw(endcharge/date endcharge/udate),
  231. qw(udate),
  232. qw(DATANAB/reset),
  233. qw(B1-R1-A/gain B1-R1-A/offset),
  234. qw(S3-R1-A/gain),
  235. qw(offset) ],
  236. "poll" => [ qw(temperature VAD VDD) ],
  237. "state" => [ qw(temperature VAD VDD) ],
  238. "interface" => "multisensor",
  239. };
  240. $owdevice{"27"} = {
  241. # DS2417 - 1-Wire Time Chip with Interrupt
  242. "read" => [ qw(date enable interval itime running udate) ],
  243. "write" => [ qw(date enable interval itime running udate) ],
  244. "poll" => [ qw(date enable running udate) ],
  245. "state" => [ qw(date enable running) ],
  246. "interface" => "timer",
  247. };
  248. $owdevice{"28"} = {
  249. # DS18B20 - Programmable Resolution 1-Wire Digital Thermometer
  250. "read" => [ qw(temperature temperature9 temperature10 temperature11 temperature12 fasttemp),
  251. qw(temphigh templow) ],
  252. "write" => [ qw(temphigh templow) ],
  253. "poll" => [ qw(temperature) ],
  254. "state" => [ qw(temperature) ],
  255. "alarm" => 1,
  256. "interface" => "temperature",
  257. };
  258. $owdevice{"29"} = {
  259. # DS2408 - 1-Wire 8 Channel Addressable Switch
  260. "read" => [ qw(latch.0 latch.1 latch.2 latch.3 latch.4 latch.5 latch.6 latch.7 latch.ALL latch.BYTE),
  261. qw(PIO.0 PIO.1 PIO.2 PIO.3 PIO.4 PIO.5 PIO.6 PIO.7 PIO.ALL PIO.BYTE),
  262. qw(power),
  263. qw(sensed.0 sensed.1 sensed.2 sensed.3 sensed.4 sensed.5 sensed.6 sensed.7 sensed.ALL),
  264. qw(strobe),
  265. qw(por),
  266. qw(set_alarm) ],
  267. "write" => [ qw(latch.0 latch.1 latch.2 latch.3 latch.4 latch.5 latch.6 latch.7 latch.ALL latch.BYTE),
  268. qw(PIO.0 PIO.1 PIO.2 PIO.3 PIO.4 PIO.5 PIO.6 PIO.7 PIO.ALL PIO.BYTE),
  269. qw(strobe),
  270. qw(por),
  271. qw(set_alarm),
  272. qw(LCD_H/clear LCD_H/home LCD_H/screen LCD_H/screenyc LCD_H/onoff LCD_H/message),
  273. qw(LCD_M/clear LCD_M/home LCD_M/screen LCD_M/screenyc LCD_M/onoff LCD_M/message) ],
  274. "poll" => [ qw(sensed.0 sensed.1 sensed.2 sensed.3 sensed.4 sensed.5 sensed.6 sensed.7) ],
  275. "state" => [ qw(sensed.0 sensed.1 sensed.2 sensed.3 sensed.4 sensed.5 sensed.6 sensed.7) ],
  276. "alarm" => 1,
  277. "event" => { qw(0 off 1 on) },
  278. "interface" => "state",
  279. };
  280. $owdevice{"3A"} = {
  281. # DS2413 - Dual Channel Addressable Switch
  282. "read" => [ qw(PIO.A PIO.B PIO.ALL PIO.BYTE),
  283. qw(sensed.A sensed.B sensed.ALL sensed.BYTE) ],
  284. "write" => [ qw(PIO.A PIO.B PIO.ALL PIO.BYTE) ],
  285. "poll" => [ qw(sensed.A sensed.B) ],
  286. "state" => [ qw(sensed.A sensed.B) ],
  287. "event" => { qw(0 off 1 on) },
  288. "interface" => "state",
  289. };
  290. $owdevice{"3B"} = {
  291. # DS1825 - Programmable Resolution 1-Wire Digital Thermometer with ID
  292. "read" => [ qw(prog_addr temperature temperature9 temperature10 temperature11 temperature12 fasttemp) ],
  293. "write" => [ qw(temphigh templow) ],
  294. "poll" => [ qw(temperature) ],
  295. "state" => [ qw(temperature) ],
  296. "alarm" => 1,
  297. "interface" => "temperature",
  298. };
  299. $owdevice{"7E"} = {
  300. # EDS0066 - Multisensor temperature Pressure
  301. "read" => [ qw(EDS0066/temperature EDS0066/pressure),
  302. qw(EDS0068/temperature EDS0068/pressure EDS0068/dew_point EDS0068/humidity EDS0068/light) ],
  303. "write" => [],
  304. "poll" => [ qw(EDS0066/temperature EDS0066/pressure),
  305. qw(EDS0068/temperature EDS0068/pressure EDS0068/dew_point EDS0068/humidity EDS0068/light) ],
  306. "state" => [ qw(EDS0066/temperature EDS0066/pressure),
  307. qw(EDS0068/temperature EDS0068/pressure EDS0068/dew_point EDS0068/humidity EDS0068/light) ],
  308. "interface" => "multisensor",
  309. };
  310. $owdevice{"81"} = {
  311. # USB id - ID found in DS2490R and DS2490B USB adapters
  312. "read" => [],
  313. "write" => [],
  314. "poll" => [ qw(id) ],
  315. "state" => [],
  316. "interface" => "id",
  317. };
  318. $owdevice{"FF"} = {
  319. # LCD - LCD controller by Louis Swart
  320. "read" => [ qw(counters.0 counters.1 counters.2 counters.3 counters.ALL),
  321. qw(cumulative.0 cumulative.1 cumulative.2 cumulative.3 cumulative.ALL),
  322. qw(data),
  323. qw(memory),
  324. qw(register),
  325. qw(version) ],
  326. "write" => [ qw(backlight),
  327. qw(cumulative.0 cumulative.1 cumulative.2 cumulative.3 cumulative.ALL),
  328. qw(data),
  329. qw(LCDon),
  330. qw(line16.0 line16.1 line16.2 line16.3 line16.ALL),
  331. qw(line20.0 line20.1 line20.2 line20.3 line20.ALL),
  332. qw(line40.0 line40.1 line40.2 line40.3 line40.ALL),
  333. qw(memory),
  334. qw(register),
  335. qw(screen16 screen20 screen40) ],
  336. "poll" => [ qw(counters.0 counters.1 counters.2 counters.3) ],
  337. "state" => [ qw(counters.0 counters.1 counters.2 counters.3) ],
  338. "interface" => "display",
  339. };
  340. # add default properties to each owdevice
  341. foreach my $f (sort keys %owdevice) {
  342. push(@{$owdevice{$f}{"read"}},qw(address crc8 family id locator r_address r_id r_locator type));
  343. @{$owdevice{$f}{"read"}} = sort(@{$owdevice{$f}{"read"}});
  344. if(defined($owdevice{$f}{"write"}) && @{$owdevice{$f}{"write"}}) {
  345. @{$owdevice{$f}{"write"}} = sort(@{$owdevice{$f}{"write"}});
  346. }
  347. if(defined($owdevice{$f}{"poll"}) && @{$owdevice{$f}{"poll"}}) {
  348. @{$owdevice{$f}{"poll"}} = sort(@{$owdevice{$f}{"poll"}});
  349. }
  350. if(defined($owdevice{$f}{"state"}) && @{$owdevice{$f}{"state"}}) {
  351. @{$owdevice{$f}{"state"}} = sort(@{$owdevice{$f}{"state"}});
  352. }
  353. }
  354. ###################################
  355. sub
  356. OWDevice_Initialize($)
  357. {
  358. my ($hash) = @_;
  359. $hash->{GetFn} = "OWDevice_Get";
  360. $hash->{SetFn} = "OWDevice_Set";
  361. $hash->{DefFn} = "OWDevice_Define";
  362. $hash->{NotifyFn} = "OWDevice_Notify";
  363. $hash->{NotifyOrderPrefix}= "50b-";
  364. $hash->{UndefFn} = "OWDevice_Undef";
  365. $hash->{AttrFn} = "OWDevice_Attr";
  366. $hash->{AttrList} = "IODev uncached trimvalues polls interfaces model cstrings ".
  367. "resolution:9,10,11,12 ".
  368. $readingFnAttributes;
  369. }
  370. ###################################
  371. # return array
  372. # 1st element: interface
  373. # 2nd element: array of getters/readings
  374. # 3rd element: array of setters/readings
  375. # 4th element: array of readings to be periodically updated
  376. # 5th element: array of readings to be written to state
  377. # 6th element: alerting device support
  378. sub
  379. OWDevice_GetDetails($) {
  380. my ($hash)= @_;
  381. my $family= substr($hash->{fhem}{address}, 0, 2);
  382. my @getters= @{$owdevice{$family}{"read"}};
  383. my @setters= @{$owdevice{$family}{"write"}};
  384. my @polls= @{$owdevice{$family}{"poll"}};
  385. my @state= @{$owdevice{$family}{"state"}};
  386. my $alerting= ($owdevice{$family}{"alarm"}) ? 1 : 0;
  387. my $interface= $owdevice{$family}{"interface"};
  388. # http://perl-seiten.homepage.t-online.de/html/perl_array.html
  389. return ($interface, \@getters, \@setters, \@polls, \@state, $alerting);
  390. }
  391. ###################################
  392. # This could be IORead in fhem, But there is none.
  393. # Read http://forum.fhem.de/index.php?t=tree&goto=54027&rid=10#msg_54027
  394. # to find out why.
  395. sub
  396. OWDevice_ReadFromServer($$@)
  397. {
  398. my ($hash,$cmd,@a) = @_;
  399. my $dev = $hash->{NAME};
  400. return if(IsDummy($dev) || IsIgnored($dev));
  401. my $iohash = $hash->{IODev};
  402. if(!$iohash ||
  403. !$iohash->{TYPE} ||
  404. !$modules{$iohash->{TYPE}} ||
  405. !$modules{$iohash->{TYPE}}{ReadFn}) {
  406. Log3 $hash, 5, "No I/O device or ReadFn found for $dev";
  407. return;
  408. }
  409. no strict "refs";
  410. my $ret;
  411. if($cmd eq "read") {
  412. $ret = &{$modules{$iohash->{TYPE}}{ReadFn}}($iohash, @a);
  413. }
  414. if($cmd eq "dir") {
  415. $ret = &{$modules{$iohash->{TYPE}}{DirFn}}($iohash, @a);
  416. }
  417. if($cmd eq "find") {
  418. $ret = &{$modules{$iohash->{TYPE}}{FindFn}}($iohash, @a);
  419. }
  420. use strict "refs";
  421. if( $iohash->{LAST_READ_FAILED} ) {
  422. $hash->{NR_READ_FAILED} = 0 if( !$hash->{NR_READ_FAILED} );
  423. $hash->{NR_READ_FAILED}++;
  424. $hash->{LAST_READ_FAILED} = 1;
  425. } else {
  426. $hash->{LAST_READ_FAILED} = 0;
  427. }
  428. return $ret;
  429. }
  430. ###################################
  431. sub
  432. OWDevice_ReadValue($$) {
  433. my ($hash,$reading)= @_;
  434. my $address= $hash->{fhem}{address};
  435. my $interface= $hash->{fhem}{interfaces};
  436. my $cache= (AttrVal($hash->{NAME},"uncached","")) ? "/uncached" : "";
  437. my $path = "$cache/$address/$reading";
  438. $path .= AttrVal($hash->{NAME},"resolution","") if( $reading eq "temperature" );
  439. #my ($seconds, $microseconds) = gettimeofday();
  440. my $value= OWDevice_ReadFromServer($hash,"read",$path);
  441. #my ($seconds2, $microseconds2) = gettimeofday();
  442. #my $msec = sprintf( "%03d msec", (($seconds2-$seconds)*1000000 + $microseconds2-$microseconds)/1000 );
  443. #Debug "$path => $value; $msec";
  444. if($interface ne "id") {
  445. if(defined($value)) {
  446. $value=~ s/\0.*$//g if(AttrVal($hash->{NAME},"cstrings",0));
  447. $value= trim($value) if(AttrVal($hash->{NAME},"trimvalues",1));
  448. } else {
  449. Log3 $hash, 3, $hash->{NAME} . ": reading $reading did not return a value";
  450. }
  451. }
  452. return $value;
  453. }
  454. ###################################
  455. sub
  456. OWDevice_WriteValue($$$) {
  457. my ($hash,$reading,$value)= @_;
  458. my $address= $hash->{fhem}{address};
  459. IOWrite($hash, "/$address/$reading", $value);
  460. return $value;
  461. }
  462. ###################################
  463. sub
  464. OWDevice_UpdateValues($) {
  465. my ($hash)= @_;
  466. my @polls= @{$hash->{fhem}{polls}};
  467. my @getters= @{$hash->{fhem}{getters}};
  468. my @state= @{$hash->{fhem}{state}};
  469. my $alerting= $hash->{fhem}{alerting};
  470. my $interface= $hash->{fhem}{interfaces};
  471. my $state;
  472. if($#polls>=0) {
  473. my $address= $hash->{fhem}{address};
  474. readingsBeginUpdate($hash);
  475. foreach my $reading (@polls) {
  476. my $value= OWDevice_ReadValue($hash,$reading);
  477. readingsBulkUpdate($hash,$reading,$value) if(defined($value));
  478. }
  479. if(@state) {
  480. foreach my $reading (@state) {
  481. my $value= ReadingsVal($hash->{NAME},$reading,undef);
  482. if(defined($value)) {
  483. $state .= "$reading: $value ";
  484. } else {
  485. $state .= "$reading: n/a ";
  486. }
  487. }
  488. }
  489. if($alerting
  490. && !$hash->{LAST_READ_FAILED}) {
  491. my $dir= OWDevice_ReadFromServer($hash,"dir","/alarm/");
  492. my $alarm= (defined($dir) && $dir =~ m/$address/) ? 1 :0;
  493. readingsBulkUpdate($hash,"alarm",$alarm);
  494. $state .= "alarm: $alarm";
  495. }
  496. if($interface eq "id"
  497. && !$hash->{LAST_READ_FAILED}) {
  498. my $dir= OWDevice_ReadFromServer($hash,"dir","/");
  499. my $present= (defined($dir) && $dir =~ m/$address/) ? 1 :0;
  500. readingsBulkUpdate($hash,"present",$present);
  501. $state .= "present: $present";
  502. my $bus= OWDevice_ReadFromServer($hash,"find",$address);
  503. my $location= (defined($bus)) ? $bus :"absent";
  504. readingsBulkUpdate($hash,"location",$location);
  505. }
  506. $state =~ s/\s+$//;
  507. readingsBulkUpdate($hash,"state",$state,0);
  508. readingsEndUpdate($hash,1);
  509. }
  510. RemoveInternalTimer($hash);
  511. InternalTimer(int(gettimeofday()) + $hash->{fhem}{interval}, "OWDevice_UpdateValues", $hash, 0)
  512. if(defined($hash->{fhem}{interval}));
  513. }
  514. ###################################
  515. sub
  516. OWDevice_Attr($@)
  517. {
  518. my ($cmd, $name, $attrName, $attrVal) = @_;
  519. my $hash = $defs{$name};
  520. $attrVal= "" unless defined($attrVal);
  521. $attrVal= "" if($cmd eq "del");
  522. if($attrName eq "polls") {
  523. my @polls= split(",", $attrVal);
  524. $hash->{fhem}{polls}= \@polls;
  525. Log3 $name, 5, "$name: polls: " . join(" ", @polls);
  526. } elsif($attrName eq "interfaces") {
  527. if($attrVal ne "") {
  528. $hash->{fhem}{interfaces}= join(";",split(",",$attrVal));
  529. Log3 $name, 5, "$name: interfaces: " . $hash->{fhem}{interfaces};
  530. } else {
  531. delete $hash->{fhem}{interfaces} if(defined($hash->{fhem}{interfaces}));
  532. Log3 $name, 5, "$name: no interfaces";
  533. }
  534. }
  535. }
  536. ###################################
  537. sub
  538. OWDevice_Get($@)
  539. {
  540. my ($hash, @a)= @_;
  541. my $name= $hash->{NAME};
  542. return "get $name needs one argument" if(int(@a) != 2);
  543. my $cmdname= $a[1];
  544. my @getters= @{$hash->{fhem}{getters}};
  545. if($cmdname ~~ @getters) {
  546. my $value= OWDevice_ReadValue($hash, $cmdname);
  547. readingsSingleUpdate($hash,$cmdname,$value,1);
  548. return $value;
  549. } else {
  550. return "Unknown argument $cmdname, choose one of " . join(" ", @getters);
  551. }
  552. }
  553. #############################
  554. sub
  555. OWDevice_Set($@)
  556. {
  557. my ($hash, @a)= @_;
  558. my $name= $hash->{NAME};
  559. my $cmdname= $a[1];
  560. my $value= $a[2];
  561. my @setters= @{$hash->{fhem}{setters}};
  562. if($cmdname ~~ @setters) {
  563. # LCD Display need more than two arguments, to display text
  564. # added by m.fischer
  565. if($cmdname =~ /(line16.0|line16.1|line16.2|line16.3|screen16)/ ||
  566. $cmdname =~ /(line20.0|line20.1|line20.2|line20.3|screen20)/ ||
  567. $cmdname =~ /(line40.0|line40.1|line40.2|line40.3|screen40)/) {
  568. shift @a;
  569. shift @a;
  570. $value= "@a";
  571. } else {
  572. return "set $name needs two arguments" if(int(@a) != 3);
  573. }
  574. OWDevice_WriteValue($hash,$cmdname,$value);
  575. readingsSingleUpdate($hash,$cmdname,$value,1);
  576. return undef;
  577. } elsif ($cmdname eq "interval") {
  578. return "Wrong interval format: Only digits are allowed!"
  579. if($value !~ m/^\d+$/);
  580. if($value == $hash->{fhem}{interval}) {
  581. return "new interval is equal to old interval.";
  582. } else {
  583. RemoveInternalTimer($hash);
  584. $hash->{fhem}{interval}= $value;
  585. InternalTimer(int(gettimeofday())+$hash->{fhem}{interval}, "OWDevice_UpdateValues", $hash, 0);
  586. return undef;
  587. }
  588. } else {
  589. return "Unknown argument $cmdname, choose one of interval " . join(" ", @setters);
  590. }
  591. }
  592. #############################
  593. sub
  594. OWDevice_Undef($$)
  595. {
  596. my ($hash, $name) = @_;
  597. delete($modules{OWDevice}{defptr}{$hash->{NAME}});
  598. RemoveInternalTimer($hash);
  599. return undef;
  600. }
  601. #############################
  602. sub
  603. OWDevice_Define($$)
  604. {
  605. my ($hash, $def) = @_;
  606. my @a = split("[ \t]+", $def);
  607. return "Usage: define <name> OWDevice <address> [interval]" if($#a < 2|| $#a > 3);
  608. my $name= $a[0];
  609. AssignIoPort($hash) if(!defined($hash->{IODev}->{NAME}));
  610. if(defined($hash->{IODev}->{NAME})) {
  611. Log3 $name, 4, "$name: I/O device is " . $hash->{IODev}->{NAME};
  612. } else {
  613. Log3 $name, 1, "$name: no I/O device";
  614. }
  615. $hash->{fhem}{address}= $a[2];
  616. if($#a == 3) {
  617. $hash->{fhem}{interval}= $a[3];
  618. Log3 $name, 5, "$name: polling every $a[3] seconds";
  619. }
  620. my ($interface, $gettersref, $settersref, $pollsref, $stateref, $alerting)= OWDevice_GetDetails($hash);
  621. my @getters= @{$gettersref};
  622. my @setters= @{$settersref};
  623. my @polls= @{$pollsref};
  624. my @state= @{$stateref};
  625. if($interface ne "") {
  626. $hash->{fhem}{interfaces}= $interface;
  627. Log3 $name, 5, "$name: interfaces: $interface";
  628. }
  629. $hash->{fhem}{getters}= $gettersref;
  630. Log3 $name, 5, "$name: getters: " . join(" ", @getters);
  631. $hash->{fhem}{setters}= $settersref;
  632. Log3 $name, 5, "$name: setters: " . join(" ", @setters);
  633. $hash->{fhem}{polls}= $pollsref;
  634. Log3 $name, 5, "$name: polls: " . join(" ", @polls);
  635. $hash->{fhem}{state}= $stateref;
  636. Log3 $name, 5, "$name: state: " . join(" ", @state);
  637. $hash->{fhem}{alerting}= $alerting;
  638. Log3 $name, 5, "$name: alerting: $alerting";
  639. $hash->{NOTIFYDEV} = "global";
  640. if( $init_done ) {
  641. OWDevice_InitValues($hash);
  642. OWDevice_UpdateValues($hash) if(defined($hash->{fhem}{interval}));
  643. }
  644. return undef;
  645. }
  646. sub
  647. OWDevice_Notify($$)
  648. {
  649. my ($hash,$dev) = @_;
  650. my $name = $hash->{NAME};
  651. my $type = $hash->{TYPE};
  652. return if($dev->{NAME} ne "global");
  653. return if(!grep(m/^INITIALIZED|REREADCFG$/, @{$dev->{CHANGED}}));
  654. return if($attr{$name} && $attr{$name}{disable});
  655. OWDevice_InitValues($hash);
  656. RemoveInternalTimer($hash);
  657. # http://forum.fhem.de/index.php/topic,16945.0/topicseen.html#msg110673
  658. my $delay = int(rand(20));
  659. Log3 $name, 5, "$name: initial delay: $delay";
  660. InternalTimer(int(gettimeofday())+$delay, "OWDevice_UpdateValues", $hash, 0) if(defined($hash->{fhem}{interval}));
  661. return undef;
  662. }
  663. sub
  664. OWDevice_InitValues($)
  665. {
  666. my ($hash) = @_;
  667. my $name = $hash->{NAME};
  668. my $model;
  669. $hash->{fhem}{bus}= OWDevice_ReadFromServer($hash,"find",$hash->{fhem}{address});
  670. $model= OWDevice_ReadValue($hash, "type");
  671. if(defined($model)) {
  672. $attr{$name}{model}= $model if($model ne "");
  673. }
  674. if($hash->{fhem}{interfaces} eq "id" && !defined($hash->{fhem}{interval})) {
  675. my $dir= OWDevice_ReadFromServer($hash,"dir","/");
  676. my $present= ($dir =~ m/$hash->{fhem}{address}/) ? 1 :0;
  677. my $bus= OWDevice_ReadFromServer($hash,"find",$hash->{fhem}{address});
  678. my $location= (defined($bus)) ? $bus :"absent";
  679. my $id= OWDevice_Get($hash, $name, "id");
  680. readingsBeginUpdate($hash);
  681. readingsBulkUpdate($hash,"id",$id);
  682. readingsBulkUpdate($hash,"present",$present);
  683. readingsBulkUpdate($hash,"state","present: $present",0);
  684. readingsBulkUpdate($hash,"location",$location);
  685. readingsEndUpdate($hash,1);
  686. }
  687. }
  688. ###################################
  689. 1;
  690. ###################################
  691. =pod
  692. =item device
  693. =item summary controls a One-Wire (1Wire) device
  694. =item summary_DE steuert ein One-Wire- (1Wire-) Gerät
  695. =begin html
  696. <a name="OWDevice"></a>
  697. <h3>OWDevice</h3>
  698. <ul>
  699. <br>
  700. <a name="OWDevicedefine"></a>
  701. <b>Define</b>
  702. <ul>
  703. <code>define &lt;name&gt; OWDevice &lt;address&gt; [&lt;interval&gt;]</code>
  704. <br><br>
  705. Defines a 1-wire device. The 1-wire device is identified by its &lt;address&gt;. It is
  706. served by the most recently defined <a href="#OWServer">OWServer</a>.
  707. <br><br>
  708. If &lt;interval&gt; is given, the OWServer is polled every &lt;interval&gt; seconds for
  709. a subset of readings.
  710. <br><br>
  711. OWDevice is a generic device. Its characteristics are retrieved at the time of the device's
  712. definition. The available readings that you can get or set as well as those that are
  713. regularly retrieved by polling can be seen when issuing the
  714. <code><a href="#list">list</a> &lt;name&gt;</code> command.
  715. <br><br>
  716. The following devices are currently supported:
  717. <ul>
  718. <li>DS2401 - Silicon Serial Number</li>
  719. <li>DS1990A - Serial Number iButton</li>
  720. <li>DS2405 - Addressable Switch</li>
  721. <li>DS18S20 - High-Precision 1-Wire Digital Thermometer</li>
  722. <li>DS1920 - iButton version of the thermometer</li>
  723. <li>DS2406, DS2407 - Dual Addressable Switch with 1kbit Memory</li>
  724. <li>DS2436 - Battery ID/Monitor Chip</li>
  725. <li>DS2423 - 4kbit 1-Wire RAM with Counter</li>
  726. <li>DS2450 - Quad A/D Converter</li>
  727. <li>DS1822 - Econo 1-Wire Digital Thermometer</li>
  728. <li>DS2433 - 4kbit 1-Wire RAM</li>
  729. <li>DS2415 - 1-Wire Time Chip</li>
  730. <li>DS1904 - RTC iButton</li>
  731. <li>DS2438 - Smart Battery Monitor</li>
  732. <li>DS2417 - 1-Wire Time Chip with Interrupt</li>
  733. <li>DS18B20 - Programmable Resolution 1-Wire Digital Thermometer</li>
  734. <li>DS2408 - 1-Wire 8 Channel Addressable Switch</li>
  735. <li>DS2413 - Dual Channel Addressable Switch</li>
  736. <li>DS1825 - Programmable Resolution 1-Wire Digital Thermometer with ID</li>
  737. <li>EDS0066 - Multisensor for temperature and pressure</li>
  738. <li>LCD - LCD controller by Louis Swart</li>
  739. </ul>
  740. <br><br>
  741. Adding more devices is simple. Look at the code (subroutine <code>OWDevice_GetDetails</code>).
  742. <br><br>
  743. This module is completely unrelated to the 1-wire modules with names all in uppercase.
  744. <br><br>
  745. <b>Note:</b>The state reading never triggers events to avoid confusion.<br><br>
  746. Example:
  747. <ul>
  748. <code>
  749. define myOWServer OWServer localhost:4304<br><br>
  750. get myOWServer devices<br>
  751. 10.487653020800 DS18S20<br><br>
  752. define myT1 OWDevice 10.487653020800<br><br>
  753. list myT1 10.487653020800<br>
  754. Internals:<br>
  755. ...<br>
  756. Readings:<br>
  757. 2012-12-22 20:30:07 temperature 23.1875<br>
  758. Fhem:<br>
  759. ...<br>
  760. getters:<br>
  761. address<br>
  762. family<br>
  763. id<br>
  764. power<br>
  765. type<br>
  766. temperature<br>
  767. templow<br>
  768. temphigh<br>
  769. polls:<br>
  770. temperature<br>
  771. setters:<br>
  772. alias<br>
  773. templow<br>
  774. temphigh<br>
  775. ...<br>
  776. </code>
  777. </ul>
  778. <br>
  779. </ul>
  780. <a name="OWDeviceset"></a>
  781. <b>Set</b>
  782. <ul>
  783. <li><code>set &lt;name&gt; interval &lt;value&gt;</code>
  784. <br><br>
  785. <code>value</code> modifies the interval for polling data. The unit is in seconds.
  786. </li>
  787. <li><code>set &lt;name&gt; &lt;reading&gt; &lt;value&gt;</code>
  788. <br><br>
  789. Sets &lt;reading&gt; to &lt;value&gt; for the 1-wire device &lt;name&gt;. The permitted values are defined by the underlying
  790. 1-wire device type.
  791. <br><br>
  792. Example:
  793. <ul>
  794. <code>set myT1 templow 5</code><br>
  795. </ul>
  796. <br>
  797. </li>
  798. </ul>
  799. <a name="OWDeviceget"></a>
  800. <b>Get</b>
  801. <ul>
  802. <code>get &lt;name&gt; &lt;reading&gt; &lt;value&gt;</code>
  803. <br><br>
  804. Gets &lt;reading&gt; for the 1-wire device &lt;name&gt;. The permitted values are defined by the underlying
  805. 1-wire device type.
  806. <br><br>
  807. Example:
  808. <ul>
  809. <code>get myT1 temperature</code><br>
  810. </ul>
  811. <br>
  812. </ul>
  813. <a name="OWDeviceattr"></a>
  814. <b>Attributes</b>
  815. <ul>
  816. <a name="IODev"></a>
  817. <li>IODev:
  818. Set the OWServer device which should be used for sending and receiving data
  819. for this OWDevice. Note: Upon startup fhem assigns each OWDevice
  820. to the last previously defined OWServer. Thus it is best if you define OWServer
  821. and OWDevices in blocks: first define the first OWServer and the OWDevices that
  822. belong to it, then continue with the next OWServer and the attached OWDevices, and so on.
  823. </li>
  824. <li>trimvalues: removes leading and trailing whitespace from readings. Default is 1 (on).</li>
  825. <li>cstrings: interprets reading as C-style string, i.e. stops reading on the first zero byte. Default is 0 (off).</li>
  826. <li>polls: a comma-separated list of readings to poll. This supersedes the list of default readings to poll.</li>
  827. <li>interfaces: supersedes the interfaces exposed by that device.</li>
  828. <li>model: preset with device type, e.g. DS18S20.</li>
  829. <li>resolution: resolution of temperature reading in bits, can be 9, 10, 11 or 12.
  830. Lower resolutions allow for faster retrieval of values from the bus.
  831. Particularly reasonable for large 1-wire installations to reduce busy times for FHEM.</li>
  832. <li><a href="#eventMap">eventMap</a></li>
  833. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  834. </ul>
  835. <br><br>
  836. </ul>
  837. =end html
  838. =begin html_DE
  839. <a name="OWDevice"></a>
  840. <h3>OWDevice</h3>
  841. <ul>
  842. <br>
  843. <a name="OWDevicedefine"></a>
  844. <b>Definition</b>
  845. <ul>
  846. <code>define &lt;name&gt; OWDevice &lt;address&gt; [&lt;interval&gt;]</code>
  847. <br><br>
  848. Definiert ein 1-Wire- Gerät. 1-Wire- Geräte werden anhand ihrer Adresse &lt;address&gt; definiert. Diese wird
  849. durch den zuvor eingerichteten <a href="#OWServer">OWServer</a> bereitgestellt.
  850. <br><br>
  851. Wird zusätzlich &lt;interval&gt; angegeben, ruft OWServer alle &lt;interval&gt; Sekunden
  852. einen Datensatz des Gerätes ab.
  853. <br><br>
  854. Jedes OWDevice ist ein eigenständiges Gerät. Seine Eigenschaften werden erstmals zum Zeitpunkt der Definition
  855. abgefragt. Die durch "get" oder "set" erzeugten, sowie durch den zyklischen Abruf gelieferten readings,
  856. können mit dem Kommando <code><a href="#list">list</a> &lt;name&gt;</code> angezeigt werden.
  857. <br><br>
  858. Folgende 1-Wire- und iButton- Komponenten werden aktuell unterstützt:
  859. <ul>
  860. <li>DS2401 - Im Chip integrierte Seriennummer</li>
  861. <li>DS1990A - iButton mit fester Seriennummer</li>
  862. <li>DS2405 - Adressierbarer Schalter</li>
  863. <li>DS18S20 - Hochpräzisions-Digital-Thermosensor</li>
  864. <li>DS1920 - iButton-Thermosensor</li>
  865. <li>DS2406, DS2407 - Dualer adressierbarer Schalter mit 1 kbit Speicher</li>
  866. <li>DS2436 - Batterie-ID/Monitor- Schaltkreis</li>
  867. <li>DS2423 - Dual-Zählerbaustein mit Speicherfunktion</li>
  868. <li>DS2450 - Vierfach-A/D Umsetzer</li>
  869. <li>DS1822 - Econo-Thermosensor</li>
  870. <li>DS2433 - 4kbit 1-Wire RAM</li>
  871. <li>DS2415 - Zeitgeber- Schaltkreis </li>
  872. <li>DS1904 - iButton-Echtzeituhr</li>
  873. <li>DS2438 - Smart-Batterie-Monitor</li>
  874. <li>DS2417 - Zeitgeber-Schaltkreis mit Interrupt</li>
  875. <li>DS18B20 - Thermosensor mit programmierbarer Auflösung</li>
  876. <li>DS2408 - 8-kanaliger adressierbarer Schalter</li>
  877. <li>DS2413 - 2-kanaliger adressierbarer Schalter</li>
  878. <li>DS1825 - Thermosensor mit programmierbarer Auflösung und ID</li>
  879. <li>EDS0066 - Vielfachsensor für Temperatur und Luftdruck</li>
  880. <li>LCD - LCD-Ansteuerung von Louis Swart</li>
  881. </ul>
  882. <br>
  883. Das Hinzufügen weiterer Geräte ist im Modulcode (subroutine <code>OWDevice_GetDetails</code>) sehr einfach möglich.
  884. <br><br>
  885. <b>Achtung: Dieses Modul ist weder verwandt noch verwendbar mit den 1-Wire Modulen, deren Namen nur aus Großbuchstaben bestehen!</b>
  886. <br><br>
  887. <b>Bitte beachten:</b> Um einer Verwechselung entgegenzuwirken, stößt das reading "state" der Geräte keine Events an.<br><br>
  888. Beispiele zur Einrichtung:
  889. <ul>
  890. <code>
  891. define myOWServer OWServer localhost:4304<br><br>
  892. get myOWServer devices<br>
  893. 10.487653020800 DS18S20<br><br>
  894. define myT1 10.487653020800<br><br>
  895. list myT1 10.487653020800<br>
  896. Internals:<br>
  897. ...<br>
  898. Readings:<br>
  899. 2012-12-22 20:30:07 temperature 23.1875<br>
  900. Fhem:<br>
  901. ...<br>
  902. getters:<br>
  903. address<br>
  904. family<br>
  905. id<br>
  906. power<br>
  907. type<br>
  908. temperature<br>
  909. templow<br>
  910. temphigh<br>
  911. polls:<br>
  912. temperature<br>
  913. setters:<br>
  914. alias<br>
  915. templow<br>
  916. temphigh<br>
  917. ...<br>
  918. </code>
  919. </ul>
  920. <br>
  921. </ul>
  922. <a name="OWDeviceset"></a>
  923. <b>Set-Befehle</b>
  924. <ul>
  925. <li><code>set &lt;name&gt; interval &lt;value&gt;</code>
  926. <br>
  927. <code>value</code> überschreibt das Abrufintervall der Datensätze. Der Wert ist in Sekunden anzugeben.
  928. </li><br>
  929. <li><code>set &lt;name&gt; &lt;reading&gt; &lt;value&gt;</code>
  930. <br>
  931. Setzt das &lt;reading&gt; auf &lt;value&gt; für das 1-Wire-Gerät &lt;name&gt;. Die verwendbaren Werte werden durch die
  932. jeweiligen 1-wire-Geräte bestimmt.
  933. <br><br>
  934. Beispiel:
  935. <ul>
  936. <code>set myT1 templow 5</code><br>
  937. </ul>
  938. <br>
  939. </li>
  940. </ul>
  941. <a name="OWDeviceget"></a>
  942. <b>Get-Befehle</b>
  943. <ul>
  944. <code>get &lt;name&gt; &lt;reading&gt; &lt;value&gt;</code>
  945. <br>
  946. Holt das &lt;reading&gt; des 1- Wire Geräte- &lt;name&gt;. Die verwendbaren Werte werden durch die
  947. jeweiligen 1-wire-Geräte bestimmt.
  948. <br><br>
  949. Beispiel:
  950. <ul>
  951. <code>get myT1 temperature</code><br>
  952. </ul>
  953. <br>
  954. </ul>
  955. <a name="OWDeviceattr"></a>
  956. <b>Attribute</b>
  957. <ul>
  958. <a name="IODev"></a>
  959. <li>IODev:
  960. Bestimmt die OWServer-Instanz, welche für das Senden und Abrufen der Daten
  961. eines OWDevice-Gerätes genutzt werden soll. Hinweis: Während des Starts
  962. ordnet FHEM die neuen OWDevice-Geräte der jeweils zuletzt definierten OWServer-Instanz zu.
  963. Deshalb verfährt man idealerweise so, dass man zuerst eine OWServer-Instanz und
  964. anschließend die zugehörigen OWDevice-Geräte definiert. Danach definiert man die
  965. nächste OWServer-Instanz, gefolgt von den zugehörigen OWDevice-Geräten, usw.
  966. </li>
  967. <li>trimvalues: Entfernt voran- und nachgestellte Leerzeichen aus den readings. Standartwert ist 1 (ein).</li>
  968. <li>cstrings: Interpretiert die readings als C-String, d.h. h&ouml;rt mit dem ersten 0-Byte zu lesen auf. Standardwert ist 0 (off).</li>
  969. <li>polls: Eine per Komma getrennte Liste der abzurufenden readings. Mit diesem Attribut unterdrückt man alle standartmäßig abgerufenen readings und ersetzt sie durch die eigene Zusammenstellung.</li>
  970. <li>interfaces: Ersetzt die durch dieses Gerät erzeugten Interfaces.</li>
  971. <li>model: Angabe des Gerätetyps, z.B.: DS18S20.</li>
  972. <li>resolution: Angabe der Auflösung für die Temperaturmessung in bits, zur Verfügung stehen: 9, 10, 11 oder 12.
  973. Hinweis: Geringere Auflösungen bewirken schnellere Reaktionen des Busses. Dies kann z.B. bei umfangreichen 1-Wire- Installationen hilfreich sein,
  974. um eventuelle Stillstände von FHEM zu vermindern.</li>
  975. <li><a href="#eventMap">eventMap</a></li>
  976. <li><a href="#readingFnAttributes">readingFnAttributes</a></li>
  977. </ul>
  978. <br><br>
  979. </ul>
  980. =end html_DE
  981. =cut