Hallo zusammen,
ab heute wird das Modul 70_HYDRAWISE über update verteilt. Das Modul liest die Daten von Hunter Hydrawise Controllern, die im WLAN hängen. Die Daten können dann über die API Schnittstelle gelesen werden, sowie vereinzelte Aktionen ausgelöst werden.
Für die Verwendung muss ein API-KEY bei Hunter beantrag werdent. Das geht einfach im Benutzerkonto
- https://app.hydrawise.com/
In FHEM wird es wie folgt definiert
define myHydrawise HYDAWISE <API-KEY> <Iintervall>
Unter 60 Sekunden ist nicht zu empfehlen, da die Schnittstelle von Hunter sonst einige Minuten sperrt, wenn zu oft angefragt wird.
Link zum Commandref:
- https://fhem.de/commandref_DE.html#HYDRAWISE
Das Thema ist aus folgendem Forumsbeitrag entstanden
- https://forum.fhem.de/index.php?topic=88589.0
Viel Spaß beim Testen.
Grüße,
Alex
Hallo xasher
Ich habe deine Hydrawise Modul eingesetzt und es funktioniert sehr gut.
Ich habe eine Bitte: Kannst Du die Readings "next" und "run_minutes" permanent machen.
Gegenwärtig löschen sich diese sobald die relays wieder deaktiviert sind.
Das bedeutet, man kann darauf keine notifys aufbauen. :-[
Danke
Gruß
Sailor
Hi Sailor,
vielen Dank für den Hinweis. Bei mir ist gerade geschäftlich viel los. Aber es macht natürlich Sinn es so umzusetzen.
Gibt es aus deiner Erfahrung bestimmte Defaultwerte, wenn der Wert nicht gesetzt ist?
Grüße,
Alex
Hi Alex
Zitat von: xasher am 16 September 2020, 07:58:45
vielen Dank für den Hinweis. Bei mir ist gerade geschäftlich viel los. Aber es macht natürlich Sinn es so umzusetzen.
Gibt es aus deiner Erfahrung bestimmte Defaultwerte, wenn der Wert nicht gesetzt ist?
Ich habe mal eine Zone für eine Minute aktiviert.
Anbei die beiden Unterschiede:
{"relay_id":2629180,"time":1576800000, "type":110,"run":0, "relay":1,"name":"Main Walkway","period":259200,"timestr":"", "stop":1},
{"relay_id":2629180,"time":1, "type":106,"run":53, "relay":1,"name":"Main Walkway","period":259200,"timestr":"Now","stop":1},
Basierend auf der API Beschreibung https://support.hydrawise.com/hc/en-us/article_attachments/360058265154/Hydrawise_REST_API.pdf
"run" ist korrekt in Sekunden Restlaufzeit und muss am Ende auch "0" haben
"timestring" ist im deaktivierten Zustand "undef".
Vielleicht sollte man das "undef" ("") umwandeln in "idle" oder "no_next_schedule".
"time" hat im deaktivierten Zustand 1576800000s = 18,25 Tage.
Vielleicht sollte man das im deaktivierten Zustand umwandeln in "none".
"Type", "Stop" und "Period" sind nicht dokumentierte Datensätze. :o
Da muss man wohl mal Hunter fragen...
Gruß
Sailor
Hallo Sailor,
ich habe jetzt das next Reading auf "idle" erweitert. Bevor ich das aber einchecke nochmals die Nachfrage, ob das Reading "run_minutes" bei dir rausfällt. Generell lösche ich alle Readings, die nicht mehr im json sind. Aber "run_minutes" sollte immer gesetzt sein, wenn es einmal in deiner Konfiguration definiert ist.
Siehe Schreenshot.
Viele Grüße,
Alex
Hallo Alex
Zitat von: xasher am 21 September 2020, 09:02:41
Bevor ich das aber einchecke nochmals die Nachfrage, ob das Reading "run_minutes" bei dir rausfällt. Generell lösche ich alle Readings, die nicht mehr im json sind.
Aber "run_minutes" sollte immer gesetzt sein, wenn es einmal in deiner Konfiguration definiert ist.
Leider fliegt das run_minutes wieder raus
Internals:
CFGFN ./cfg/Room_OS.cfg
DEF 0C6D-ABE8-ABE8-49DB 60
FUUID 5f4678be-f33f-02bc-b4c0-c9558dd2dde33528
INTERVAL 60
NAME OS_Hydrawise
NR 3002
STATE on
TYPE HYDRAWISE
OLDREADINGS:
READINGS:
2020-09-22 20:43:19 controller_counts 1
2020-09-08 20:40:50 controller_id 396580
2020-09-22 20:43:19 ct1_controller_id 396580
2020-09-22 20:43:19 ct1_controller_message All good!
2020-09-22 20:43:19 ct1_controller_name My Controller
2020-09-22 20:43:19 ct1_last_contact 2020-09-22 20:05:12
2020-09-22 20:43:19 ct1_serial_number 0590a1bb
2020-09-22 20:43:19 cur_controller_id 396580
2020-09-22 20:43:19 cur_controller_name My Controller
2020-09-22 20:43:19 customer_id 407812
2020-09-22 20:43:19 presence present
2020-09-22 20:43:19 relay_counts 10
2020-09-22 20:43:19 rl10_name Fresh Water
2020-09-22 20:43:19 rl10_relay 10
2020-09-22 20:43:19 rl10_relay_id 2629280
2020-09-03 10:57:55 rl12_name Well Pump
2020-09-03 10:57:55 rl12_relay 12
2020-09-03 10:57:55 rl12_relay_id 2628802
2020-09-22 20:43:19 rl1_name Main Walkway
2020-09-22 20:43:19 rl1_relay 1
2020-09-22 20:43:19 rl1_relay_id 2629180
2020-09-22 20:43:19 rl2_name Danielles Garde
2020-09-22 20:43:19 rl2_relay 2
2020-09-22 20:43:19 rl2_relay_id 2629204
2020-09-22 20:43:19 rl3_name Lawn Sprinkler
2020-09-22 20:43:19 rl3_relay 3
2020-09-22 20:43:19 rl3_relay_id 2629212
2020-09-22 20:43:19 rl4_name South-West Patt
2020-09-22 20:43:19 rl4_relay 4
2020-09-22 20:43:19 rl4_relay_id 2629224
2020-09-22 20:43:19 rl5_name Jurassic Garden
2020-09-22 20:43:19 rl5_relay 5
2020-09-22 20:43:19 rl5_relay_id 2629238
2020-09-22 20:43:19 rl6_name Greenhouse
2020-09-22 20:43:19 rl6_relay 6
2020-09-22 20:43:19 rl6_relay_id 2629258
2020-09-22 20:43:19 rl7_name Pond Garden
2020-09-22 20:43:19 rl7_relay 7
2020-09-22 20:43:19 rl7_relay_id 2629269
2020-09-22 20:43:19 rl8_name Pattio House
2020-09-22 20:43:19 rl8_relay 8
2020-09-22 20:43:19 rl8_relay_id 2629270
2020-09-22 20:43:19 rl9_name East Garden
2020-09-22 20:43:19 rl9_relay 9
2020-09-22 20:43:19 rl9_relay_id 2629278
2020-09-22 20:43:19 state on
helper:
APIKEY 0C6D-ABE8-ABE8-49DB
Attributes:
DbLogExclude .*
event-on-change-reading .*
room Outside
webCmd stopall renewContext renewRelays
Wundert mich aber auch nicht:
Zeile 782:
readingsDelete( $hash, $reading );
Anbei mal der gesamte Breakdown des JSON-Strings im Ruhezustands
time 1600800691
nextpoll 60
message ""
simRelays 1
options 1
stupdate 0
master 0
master_timer 0
master_post_timer 0
expanders []
sensors
0
input 0
type 3
mode 0
timer 0
offtimer 0
rate 5
relays []
1
input 1
type 1
mode 1
timer 0
offtimer 0
relays []
relays
0
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 1
name "Main Walkway"
period 259200
timestr ""
stop 1
1
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 2
name "Danielles Garde"
period 259200
timestr ""
stop 1
2
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 3
name "Lawn Sprinkler"
period 259200
timestr ""
stop 1
3
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 4
name "South-West Patt"
period 259200
timestr ""
stop 1
4
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 5
name "Jurassic Garden"
period 259200
timestr ""
stop 1
5
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 6
name "Greenhouse"
period 259200
timestr ""
stop 1
6
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 7
name "Pond Garden"
period 259200
timestr ""
stop 1
7
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 8
name "Pattio House"
period 259200
timestr ""
stop 1
8
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 9
name "East Garden"
period 259200
timestr ""
stop 1
9
relay_id xxxxxxx
time 1576800000
type 110
run 0
relay 10
name "Fresh Water"
period 259200
timestr ""
stop 1
Gruß
Sailor
Hi Sailor,
ich habe es mal wie im Anhang eingecheckt...
Viele Grüße,
Alex
Ein herzerfrischendes Moin vom achtern Diek vorweg
Ich habe jetzt meine Bewaesserungskreise im ftui eingearbeitet.
Wer Interesse an dem Code hat:
<li data-row="1" data-col="1" data-sizex="3" data-sizey="6" class="semitransparent">
<header class = "semitransparentheader">Sprinkler
</header>
<BR>
<table width="100%">
<tbody>
<tr>
<td colspan="3" class="big">HYDRAWISE Irrigation Control
</td>
</tr>
<tr>
<td colspan ="3">
<div class = "big"
data-type = "push"
data-device = "OS_Hydrawise"
data-get = "ct1_controller_message"
data-get-on = "Error"
data-icon = "mi-error fa-blink"
data-on-color = "#FF0000"
data-hide = "ct1_controller_message"
data-hide-on = "All good!"
data-fhem-cmd = '{fhem("set OS_Hydrawise renewContext")}'>
</div>
<div data-type = "image"
data-url = "../images/default/Hunter-PHC.png"
data-size = "84px"
data-device = "OS_Hydrawise"
data-hide = "ct1_controller_message"
data-hide-on = "^((?!All good\!).)*$"
data-hide-off = "All good!">
</div>
</td>
</tr>
<tr>
<td colspan="3" class="big">
<BR>
All Sprinkler
</td>
</tr>
<tr>
<td colspan="3">
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-fhem-cmd = '{fhem("set OS_Hydrawise stopall");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline big" >
</div>
</td>
</tr>
<tr>
<td colspan="3" class="big">
<BR>
Individual Zones
</td>
</tr>
<tr>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl1_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl1_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl1_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl1_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl1_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl1_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl1_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl1_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
<td></td>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl2_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl2_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl2_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl2_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl2_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl2_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl2_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl2_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
</tr>
<tr>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl3_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl3_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl3_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl3_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl3_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl3_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl3_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl3_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
<td></td>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl4_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl4_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl4_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl4_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl4_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl4_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl4_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl4_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
</tr>
<tr>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl5_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl5_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl5_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl5_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl5_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl5_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl5_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl5_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
<td></td>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl6_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl6_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl6_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl6_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl6_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl6_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl6_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl6_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
</tr>
<tr>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl7_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl7_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl7_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl7_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl7_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl7_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl7_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl7_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
<td></td>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl8_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl8_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl8_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl8_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl8_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl8_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl8_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl8_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
</tr>
<tr>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl9_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl9_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl9_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl9_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl9_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl9_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl9_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl9_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
<td></td>
<td><BR><div class="big"
data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl10_name">
</div>
<div data-type = "symbol"
data-device = "OS_Hydrawise"
data-get = "rl10_next"
data-states = '["Running", "idle"]'
data-icons = '["oa-sani_sprinkling fa-blink","oa-sani_sprinkling"]'
data-colors = '["blue","#4C5D71"]'
class = "bigger inline">
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "fa-hand-stop-o"
data-hide = "rl10_next"
data-hide-on = "idle"
data-hide-off = "Running"
data-fhem-cmd = '{fhem("set OS_Hydrawise stop " . ReadingsVal("OS_Hydrawise", "rl10_relay_id",0));; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "push"
data-device = "OS_Hydrawise"
data-icon = "oa-audio_play"
data-hide = "rl10_next"
data-hide-on = "Running"
data-hide-off = "idle"
data-fhem-cmd = '{fhem("set OS_Hydrawise run " . ReadingsVal("OS_Hydrawise", "rl10_relay_id",0) . " 600");; fhem("set OS_Hydrawise renewRelays")}'
class = "inline" >
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl10_run_minutes"
data-fix = "2"
data-hide-on = "none"
data-pre-text = "Irrigation Time left: "
data-unit = " min">
</div>
<div data-type = "label"
data-device = "OS_Hydrawise"
data-get = "rl10_run_minutes"
data-hide-on = "^((?!none).)*$"
data-substitution='["none","Irrigation OFF"]'>
</div>
</td>
</tr>
</tbody>
</table>
</li>
Die Datei "Hunter-PHC" muss unter "/opt/fhem/www/images/default" abgelegt werden.
Rechtevergabe nicht vergessen!
Gruss
Sailor
Ich habe eine Frage zum Modul. In der Hilfe steht
ZitatRelay 1: Länge der nächsten Laufzeit. Wenn ein Lauf im Gange ist, gibt der Wert die Anzahl der verbleibenden Sekunden an.
und im Code sehe ich aber ausschließlich
"rl" . $relays->{relay} . "_run_minutes",
$relays->{run} / 60
und das beide Male. Kann es sein, dass dies die Anzahl der verbleibenden
Minuten ist? Ich würde auch gern ein Signal haben, ob die Zone gerade aktiv bewässert wird. Die API liefert das in
Zitattime integer = Number of seconds until the next programmed run. Value will be 1 if a run is in progress
Gab es Gründe das nicht einzubauen? Ich werde das definitiv für mich umsetzen, aber vielleicht interessiert das auch andere?
PS Und jetzt habe ich mich in der Hektik vergessen bei allen und vor allem bei xasher zu bedanken für das tolle Modul!
PPS Jetzt sehe ich, dass das ausgeblendet ist - richtig? Zeile 617
HYDRAWISE_ReadingsBulkUpdateIfChanged($hash,
"rl".$relays->{relay}."_time",
$relays->{time});
Zitat von: Sailor am 21 November 2020, 18:16:03Ich habe jetzt meine Bewaesserungskreise im ftui eingearbeitet.
Wer Interesse an dem Code hat:
Hallo Sailor und wer das noch so nutzt! Ich habe das in FTUI
3 umgeschrieben und ein wenig verändert. Bei mir gibt es sechs Zonen und den Code kann man unmittelbar verwenden, man muss nur den eigenen Namen des Devices überall ändern (bei mir heißt das Device "Bewaesserung"). Ich habe es so geregelt, dass der Panikbutton unten ist und die drei Zonen jeweils als drei Buttons ohne weiteren Informationen erscheinen. Wenn eine Zone "aus" ist, wird der Start-Button (in schwarz) gezeigt. Ist eine Zone "an", ändert sich der Start-Button zu einem roten Stop-Button, mehr wird nicht mitgeteilt. Die Laufzeiten etc. habe ich hier nicht notiert, weil ich die in meiner Webseite (WAF) nicht benötige und sie nur verwirren. Der Code greift bei mir intern auf das reading
rlX_next zurück: Das zeigt nämlich "Running", wenn die Zone bewässert wird. Im Anhang ein Screenshot.
<ftui-grid-tile row="3" col="2" height="7" width="4" shape="round">
<style>
.zone-title {
height: 38px; /* Platz für bis zu 2 Zeilen */
display: flex;
align-items: center; /* oder: flex-end, wenn die Baseline unten bündig sein soll */
justify-content: center;
text-align: center;
}
</style>
<!-- Überschrift für Einzelzonen -->
<ftui-row style="justify-content:center; margin-bottom:6px;">
<ftui-label class-name="big" color="gray" text="Zonen"></ftui-label>
</ftui-row>
<!-- Zonen 1–3 -->
<ftui-row style="gap:16px; justify-content:space-between;">
<!-- Zone 1 -->
<ftui-column style="align-items:center; gap:6px; flex:1; min-width:0;">
<!-- Name -->
<ftui-row class="zone-title">
<ftui-label class-name="big" [text]="Bewaesserung:rl1_name"></ftui-label>
</ftui-row><!-- START nur wenn time != 1 -->
<!-- STOP nur wenn time == 1 -->
<ftui-row [hidden]="Bewaesserung:rl1_next | map('Running:true, .*:false')">
<ftui-button shape="circle" size="large" color="black" class-name="bigger"
[states]="Bewaesserung:rl1_relay_id"
(value)="set Bewaesserung run $value 600; set Bewaesserung renewRelays">
<ftui-icon name="play-circle-o" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl1_next | map('Running:false, .*:true')">
<ftui-button shape="circle" size="large" color="danger" class-name="bigger"
[states]="Bewaesserung:rl1_relay_id"
(value)="set Bewaesserung stop $value; set Bewaesserung renewRelays">
<ftui-icon name="ban" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-column>
<!-- Zone 2 -->
<ftui-column style="align-items:center; gap:6px; flex:1; min-width:0;">
<ftui-row class="zone-title">
<ftui-label class-name="big" [text]="Bewaesserung:rl2_name"></ftui-label>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl2_next | map('Running:true, .*:false')">
<ftui-button shape="circle" size="large" color="black" class-name="bigger"
[states]="Bewaesserung:rl2_relay_id"
(value)="set Bewaesserung run $value 600; set Bewaesserung renewRelays">
<ftui-icon name="play-circle-o" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl2_next | map('Running:false, .*:true')">
<ftui-button shape="circle" size="large" color="danger" class-name="bigger"
[states]="Bewaesserung:rl2_relay_id"
(value)="set Bewaesserung stop $value; set Bewaesserung renewRelays">
<ftui-icon name="ban" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-column>
<!-- Zone 3 -->
<ftui-column style="align-items:center; gap:6px; flex:1; min-width:0;">
<ftui-row class="zone-title">
<ftui-label class-name="big" [text]="Bewaesserung:rl3_name"></ftui-label>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl3_next | map('Running:true, .*:false')">
<ftui-button shape="circle" size="large" color="black" class-name="bigger"
[states]="Bewaesserung:rl3_relay_id"
(value)="set Bewaesserung run $value 600; set Bewaesserung renewRelays">
<ftui-icon name="play-circle-o" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl3_next | map('Running:false, .*:true')">
<ftui-button shape="circle" size="large" color="danger" class-name="bigger"
[states]="Bewaesserung:rl3_relay_id"
(value)="set Bewaesserung stop $value; set Bewaesserung renewRelays">
<ftui-icon name="ban" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-column>
</ftui-row>
<!-- Zonen 4–6 -->
<ftui-row style="gap:16px; justify-content:space-between; margin-top:10px;">
<!-- Zone 4 -->
<ftui-column style="align-items:center; gap:6px; flex:1; min-width:0;">
<ftui-row class="zone-title">
<ftui-label class-name="big" [text]="Bewaesserung:rl4_name"></ftui-label>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl4_next | map('Running:true, .*:false')">
<ftui-button shape="circle" size="large" color="black" class-name="bigger"
[states]="Bewaesserung:rl4_relay_id"
(value)="set Bewaesserung run $value 600; set Bewaesserung renewRelays">
<ftui-icon name="play-circle-o" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl4_next | map('Running:false, .*:true')">
<ftui-button shape="circle" size="large" color="danger" class-name="bigger"
[states]="Bewaesserung:rl4_relay_id"
(value)="set Bewaesserung stop $value; set Bewaesserung renewRelays">
<ftui-icon name="ban" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-column>
<!-- Zone 5 -->
<ftui-column style="align-items:center; gap:6px; flex:1; min-width:0;">
<ftui-row class="zone-title">
<ftui-label class-name="big" [text]="Bewaesserung:rl5_name"></ftui-label>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl5_next | map('Running:true, .*:false')">
<ftui-button shape="circle" size="large" color="black" class-name="bigger"
[states]="Bewaesserung:rl5_relay_id"
(value)="set Bewaesserung run $value 600; set Bewaesserung renewRelays">
<ftui-icon name="play-circle-o" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl5_next | map('Running:false, .*:true')">
<ftui-button shape="circle" size="large" color="danger" class-name="bigger"
[states]="Bewaesserung:rl5_relay_id"
(value)="set Bewaesserung stop $value; set Bewaesserung renewRelays">
<ftui-icon name="ban" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-column>
<!-- Zone 6 -->
<ftui-column style="align-items:center; gap:6px; flex:1; min-width:0;">
<ftui-row class="zone-title">
<ftui-label class-name="big" [text]="Bewaesserung:rl6_name"></ftui-label>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl6_next | map('Running:true, .*:false')">
<ftui-button shape="circle" size="large" color="black" class-name="bigger"
[states]="Bewaesserung:rl6_relay_id"
(value)="set Bewaesserung run $value 600; set Bewaesserung renewRelays">
<ftui-icon name="play-circle-o" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row [hidden]="Bewaesserung:rl6_next | map('Running:false, .*:true')">
<ftui-button shape="circle" size="large" color="danger" class-name="bigger"
[states]="Bewaesserung:rl6_relay_id"
(value)="set Bewaesserung stop $value; set Bewaesserung renewRelays">
<ftui-icon name="ban" color="grid" size="large"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-column>
</ftui-row>
<!-- Panikbutton -->
<ftui-row style="flex-direction:column; align-items:center; gap:6px; margin:30px 0 12px 0;">
<ftui-label class-name="big" style="color:gray">Panikbutton</ftui-label>
<ftui-button shape="circle" size="large" color="danger"
(click)="set Bewaesserung stopall; set Bewaesserung renewRelays">
<ftui-icon name="ban" size="large" color="grid"></ftui-icon>
</ftui-button>
</ftui-row>
<!-- Kopf: Fehlerhinweis -->
<ftui-row style="justify-content:center; gap:10px; margin-top:6px;">
<ftui-button class-name="big" color="danger"
[text]="Bewaesserung:ct1_controller_message"
[hidden]="Bewaesserung:ct1_controller_message | map('Error:false, .*:true')"
(click)="set Bewaesserung renewContext">
<ftui-icon name="exclamation-triangle"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-grid-tile>
[/quote]
Also eigentlich geht das noch einfacher. Da man (bei mir) niemals zwei Zonen gleichzeitig anwerfen kann, macht es wenig Sinn, alle Knöpfe gleichzeitig zu zeigen. Circlemenu scheint mir logischer zu sein. Man muss dann allerdings die IDs der Relayse händisch eintragen. Da die sich aber nicht ändern (ich baue den Mist jedenfalls nicht in den nächsten Wochen ab), ist das ok
<ftui-grid-tile row="3" col="2" height="7" width="5" shape="round">
<ftui-row style="justify-content:center; gap:1px; margin-top:1px;">
<ftui-label class-name="big" color="gray" text="Eine Zone an (für 10 Minuten)"></ftui-label>
</ftui-row>
<ftui-row style="gap:1px; justify-content:center;">
<ftui-circlemenu>
<ftui-icon class-name="bigger" name="play-circle-o" color="black"></ftui-icon>
<ftui-button shape="circle" size="large" name="play-circle-o" color="medium" class-name="bigger"
(value)="set Bewaesserung run XXXXX 600; set Bewaesserung renewRelays">
Rasen A
</ftui-button>
<ftui-button shape="circle" size="large" name="play-circle-o" color="medium" class-name="bigger"
(value)="set Bewaesserung run XXXXX 600; set Bewaesserung renewRelays">
Rasen Mitte
</ftui-button>
<ftui-button shape="circle" size="large" name="play-circle-o" color="medium" class-name="bigger"
(value)="set Bewaesserung run XXXXX 600; set Bewaesserung renewRelays">
Beet Vita
</ftui-button>
<ftui-button shape="circle" size="large" name="play-circle-o" color="medium" class-name="bigger"
(value)="set Bewaesserung run XXXXX 600; set Bewaesserung renewRelays">
Hecke A
</ftui-button>
<ftui-button shape="circle" size="large" name="play-circle-o" color="medium" class-name="bigger"
(value)="set Bewaesserung run XXXXX 600; set Bewaesserung renewRelays">
Beerengarten
</ftui-button>
<ftui-button shape="circle" size="large" name="play-circle-o" color="medium" class-name="bigger"
(value)="set Bewaesserung run XXXXX 600; set Bewaesserung renewRelays">
Erbeer/Gemüse
</ftui-button>
</ftui-circlemenu>
</ftui-row>
<!-- Kopf: Fehlerhinweis -->
<ftui-row style="justify-content:center; gap:10px; margin-top:6px;">
<ftui-button class-name="big" color="danger"
[text]="Bewaesserung:ct1_controller_message"
[hidden]="Bewaesserung:ct1_controller_message | map('Error:false, .*:true')"
(click)="set Bewaesserung renewContext">
<ftui-icon name="exclamation-triangle"></ftui-icon>
</ftui-button>
</ftui-row>
<ftui-row style="flex-direction:column; align-items:center; gap:6px; margin:30px 0 12px 0;">
<ftui-label class-name="big" style="color:gray">Sofort-Aus</ftui-label>
<ftui-button shape="circle" size="large" color="danger"
(click)="set Bewaesserung stopall; set Bewaesserung renewRelays">
<ftui-icon name="ban" size="large" color="grid"></ftui-icon>
</ftui-button>
</ftui-row>
</ftui-grid-tile>