some more work on states and the rules doc
This commit is contained in:
parent
30776744c2
commit
6dd81e641c
692
doc/images/Rules_definition.svg
Normal file
692
doc/images/Rules_definition.svg
Normal file
@ -0,0 +1,692 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="800"
|
||||||
|
height="450"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="0.48.4 r9939"
|
||||||
|
sodipodi:docname="Rules_definition.svg"
|
||||||
|
inkscape:export-filename="/home/micha/Develop/Hive/doc/images/Rules_definition.png"
|
||||||
|
inkscape:export-xdpi="141.00999"
|
||||||
|
inkscape:export-ydpi="141.00999">
|
||||||
|
<defs
|
||||||
|
id="defs4">
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mstart"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mstart"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4022"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(0.4,0,0,0.4,4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Mend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Mend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4025"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
<marker
|
||||||
|
inkscape:stockid="Arrow1Lend"
|
||||||
|
orient="auto"
|
||||||
|
refY="0"
|
||||||
|
refX="0"
|
||||||
|
id="Arrow1Lend"
|
||||||
|
style="overflow:visible">
|
||||||
|
<path
|
||||||
|
id="path4019"
|
||||||
|
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||||
|
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||||
|
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="2.8"
|
||||||
|
inkscape:cx="309.60867"
|
||||||
|
inkscape:cy="199.52901"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="true"
|
||||||
|
objecttolerance="20"
|
||||||
|
guidetolerance="20"
|
||||||
|
inkscape:window-width="2880"
|
||||||
|
inkscape:window-height="1726"
|
||||||
|
inkscape:window-x="-12"
|
||||||
|
inkscape:window-y="39"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
fit-margin-left="10"
|
||||||
|
fit-margin-top="10"
|
||||||
|
fit-margin-right="10"
|
||||||
|
fit-margin-bottom="10">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid2985"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="false"
|
||||||
|
originx="36px"
|
||||||
|
originy="-622.40911px" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(36,20.046952)">
|
||||||
|
<g
|
||||||
|
id="g3852"
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,0.11188031,78.466151)">
|
||||||
|
<rect
|
||||||
|
ry="0.80439985"
|
||||||
|
rx="1.5232613"
|
||||||
|
y="114.94991"
|
||||||
|
x="49.001541"
|
||||||
|
height="24.088234"
|
||||||
|
width="88.695778"
|
||||||
|
id="rect2987"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:0.46546766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3757"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:12px"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
id="tspan3759"
|
||||||
|
sodipodi:role="line">State</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g3857"
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,-16.950645,-450.37737)">
|
||||||
|
<rect
|
||||||
|
ry="0.80439985"
|
||||||
|
rx="1.5232613"
|
||||||
|
y="280.81873"
|
||||||
|
x="59.783287"
|
||||||
|
height="24.088234"
|
||||||
|
width="88.695778"
|
||||||
|
id="rect2987-2"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:0.46546766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3757-5"
|
||||||
|
y="297.15192"
|
||||||
|
x="66.781746"
|
||||||
|
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:12px"
|
||||||
|
y="297.15192"
|
||||||
|
x="66.781746"
|
||||||
|
id="tspan3759-0"
|
||||||
|
sodipodi:role="line">Event</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4977">
|
||||||
|
<path
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
|
||||||
|
d="m 284.16404,298.62934 c -10.48814,0 -18.99046,-8.50231 -18.99046,-18.99046 0,-10.48812 8.50232,-18.99045 18.99046,-18.99045 l 72.79676,0 c 10.48814,0 18.99046,8.50233 18.99046,18.99045 0,10.48815 -8.50232,18.99046 -18.99046,18.99046 z"
|
||||||
|
id="path3785"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csccscc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3787"
|
||||||
|
y="286.37347"
|
||||||
|
x="274.68225"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:22.15553474px"
|
||||||
|
y="286.37347"
|
||||||
|
x="274.68225"
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3253">[>|<|!]=</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4383">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,-205.0651,-38.967366)"
|
||||||
|
d="m 235,136.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="136.36218"
|
||||||
|
sodipodi:cx="223"
|
||||||
|
id="path3785-8"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.26379251;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3787-3"
|
||||||
|
y="182.87833"
|
||||||
|
x="141.82605"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:22.15553474px"
|
||||||
|
y="182.87833"
|
||||||
|
x="141.82605"
|
||||||
|
id="tspan3789-3"
|
||||||
|
sodipodi:role="line">c</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4395">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,-205.17377,-113.2888)"
|
||||||
|
d="m 235,136.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="136.36218"
|
||||||
|
sodipodi:cx="223"
|
||||||
|
id="path3785-8-9"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.26379251;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3787-3-6"
|
||||||
|
y="108.36217"
|
||||||
|
x="144"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:22.15553474px"
|
||||||
|
y="108.36217"
|
||||||
|
x="144"
|
||||||
|
id="tspan3789-3-0"
|
||||||
|
sodipodi:role="line">|</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g5050">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,155.08925,-107.5011)"
|
||||||
|
d="m 235,136.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="136.36218"
|
||||||
|
sodipodi:cx="223"
|
||||||
|
id="path3785-8-0"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.26379251;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3787-3-1"
|
||||||
|
y="116.36217"
|
||||||
|
x="499"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:22.15553474px"
|
||||||
|
y="116.36217"
|
||||||
|
x="499"
|
||||||
|
id="tspan3789-3-1"
|
||||||
|
sodipodi:role="line">&</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,124.34113,-99.386645)"
|
||||||
|
id="g3852-5">
|
||||||
|
<rect
|
||||||
|
ry="0.80439985"
|
||||||
|
rx="1.5232613"
|
||||||
|
y="114.94991"
|
||||||
|
x="49.001541"
|
||||||
|
height="24.088234"
|
||||||
|
width="88.695778"
|
||||||
|
id="rect2987-5"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:0.46546766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3757-1"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:12px"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
id="tspan3759-9"
|
||||||
|
sodipodi:role="line">State</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g4003"
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,338.3813,145.7761)">
|
||||||
|
<path
|
||||||
|
d="m 123,84.362183 c 0,6.075132 -12.53603,11 -28,11 -15.463973,0 -28,-4.924868 -28,-11 0,-6.075133 12.536027,-11 28,-11 15.46397,0 28,4.924867 28,11 z"
|
||||||
|
sodipodi:ry="11"
|
||||||
|
sodipodi:rx="28"
|
||||||
|
sodipodi:cy="84.362183"
|
||||||
|
sodipodi:cx="95"
|
||||||
|
id="path3997"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.26379251;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3999"
|
||||||
|
y="88.835815"
|
||||||
|
x="78.746094"
|
||||||
|
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:12px"
|
||||||
|
y="88.835815"
|
||||||
|
x="78.746094"
|
||||||
|
id="tspan4001"
|
||||||
|
sodipodi:role="line">value</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,172.83338,11.391036)"
|
||||||
|
id="g3852-5-1">
|
||||||
|
<rect
|
||||||
|
ry="0.80439985"
|
||||||
|
rx="1.5232613"
|
||||||
|
y="114.94991"
|
||||||
|
x="49.001541"
|
||||||
|
height="24.088234"
|
||||||
|
width="88.695778"
|
||||||
|
id="rect2987-5-8"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:0.46546766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3757-1-4"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:12px"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
id="tspan3759-9-5"
|
||||||
|
sodipodi:role="line">State</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,477.37786,-187.5235)"
|
||||||
|
id="g3852-5-9">
|
||||||
|
<rect
|
||||||
|
ry="0.80439985"
|
||||||
|
rx="1.5232613"
|
||||||
|
y="114.94991"
|
||||||
|
x="49.001541"
|
||||||
|
height="24.088234"
|
||||||
|
width="88.695778"
|
||||||
|
id="rect2987-5-4"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:0.46546766;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3757-1-6"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:12px"
|
||||||
|
y="131.36218"
|
||||||
|
x="56"
|
||||||
|
id="tspan3759-9-4"
|
||||||
|
sodipodi:role="line">Action</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="g5055">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,273.08925,-66.981752)"
|
||||||
|
d="m 235,136.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="136.36218"
|
||||||
|
sodipodi:cx="223"
|
||||||
|
id="path3785-8-0-7"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.26379251;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3787-3-1-2"
|
||||||
|
y="157.36218"
|
||||||
|
x="617"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:22.15553474px"
|
||||||
|
y="157.36218"
|
||||||
|
x="617"
|
||||||
|
id="tspan3789-3-1-0"
|
||||||
|
sodipodi:role="line">&</tspan></text>
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
id="rect5099"
|
||||||
|
width="3.1650765"
|
||||||
|
height="52.223759"
|
||||||
|
x="-24.417461"
|
||||||
|
y="123.70473"
|
||||||
|
rx="2.4106193"
|
||||||
|
ry="1.2729934" />
|
||||||
|
<rect
|
||||||
|
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.99999988;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
id="rect5099-4"
|
||||||
|
width="3.1650765"
|
||||||
|
height="52.223759"
|
||||||
|
x="745.65698"
|
||||||
|
y="123.70473"
|
||||||
|
rx="2.4106193"
|
||||||
|
ry="1.2729934" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#006dff;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M -21.252385,148.54885 124.0481,32.149541"
|
||||||
|
id="path5139"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#rect5099"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3857"
|
||||||
|
inkscape:connection-end-point="d4" />
|
||||||
|
<path
|
||||||
|
style="fill:#ff0000;stroke:#ff0000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M -21.252385,151.0185 122.74396,260.37878"
|
||||||
|
id="path5325"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="100"
|
||||||
|
inkscape:connection-start="#rect5099"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3852"
|
||||||
|
inkscape:connection-end-point="d4" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 218.02315,13.142224 336.90152,0.254221"
|
||||||
|
id="path6067"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3857"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3852-5-9"
|
||||||
|
inkscape:connection-end-point="d4" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 497.47912,262.21442 615.32811,32.509679"
|
||||||
|
id="path6071"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4003"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3852-5-9"
|
||||||
|
inkscape:connection-end-point="d4" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 642.17758,32.509679 745.65698,148.04962"
|
||||||
|
id="path6447"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3852-5-9"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#rect5099-4"
|
||||||
|
inkscape:connection-end-point="d4" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m -26,411.11306 c 126.60306,0 126.60306,0 126.60306,0"
|
||||||
|
id="path7759"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path7772"
|
||||||
|
d="m -26,382.76382 c 126.60306,0 126.60306,0 126.60306,0"
|
||||||
|
style="fill:none;stroke:#003fff;stroke-width:0.99999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
x="138.35789"
|
||||||
|
y="416.35211"
|
||||||
|
id="text7774"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan7776"
|
||||||
|
x="138.35789"
|
||||||
|
y="416.35211"
|
||||||
|
style="font-size:18.99045753px">Trigger path 2</tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
x="138.35789"
|
||||||
|
y="388.0029"
|
||||||
|
id="text7782"
|
||||||
|
sodipodi:linespacing="125%"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan7784"
|
||||||
|
x="138.35789"
|
||||||
|
y="388.0029"
|
||||||
|
style="font-size:18.99045753px">Trigger path 1</tspan></text>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#0052ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 183.84092,276.72995 0,-64.55732"
|
||||||
|
id="path4388"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3852"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g4383"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#0052ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 183.81315,174.19173 -0.0531,-36.34056"
|
||||||
|
id="path4400"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4383"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g4395"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#0052ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 202.72219,118.71972 35.16575,-0.26113"
|
||||||
|
id="path4402"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4395"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3852-5"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#0052ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 276.60161,136.99771 -76.51506,46.3446"
|
||||||
|
id="path4404"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3852-5"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g4383"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#0052ff;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 183.75533,99.870291 0.0624,-51.369577"
|
||||||
|
id="path4406"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4395"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3857"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 254.02315,295.87143 47.15054,0.0546"
|
||||||
|
id="path5001"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3852"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g4977"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 411.9509,295.87266 68.46109,-0.1451"
|
||||||
|
id="path5003"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4977"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g4003"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 356.56242,247.77539 0,29.22421"
|
||||||
|
id="path5009"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3852-5-1"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g4977"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<g
|
||||||
|
id="g5092">
|
||||||
|
<path
|
||||||
|
transform="matrix(1.5825382,0,0,1.5825382,105.82623,-0.2888)"
|
||||||
|
d="m 235,136.36218 c 0,6.62742 -5.37258,12 -12,12 -6.62742,0 -12,-5.37258 -12,-12 0,-6.62741 5.37258,-12 12,-12 6.62742,0 12,5.37259 12,12 z"
|
||||||
|
sodipodi:ry="12"
|
||||||
|
sodipodi:rx="12"
|
||||||
|
sodipodi:cy="136.36218"
|
||||||
|
sodipodi:cx="223"
|
||||||
|
id="path3785-8-9-9"
|
||||||
|
style="fill:#fffed5;fill-opacity:1;stroke:#000000;stroke-width:1.26379251;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||||
|
sodipodi:type="arc" />
|
||||||
|
<text
|
||||||
|
sodipodi:linespacing="125%"
|
||||||
|
id="text3787-3-6-8"
|
||||||
|
y="221.36217"
|
||||||
|
x="455"
|
||||||
|
style="font-size:63.30152893px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
||||||
|
xml:space="preserve"><tspan
|
||||||
|
style="font-size:22.15553474px"
|
||||||
|
y="221.36217"
|
||||||
|
x="455"
|
||||||
|
id="tspan3789-3-0-9"
|
||||||
|
sodipodi:role="line">|</tspan></text>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 516.6709,278.5124 502.81569,249.04986"
|
||||||
|
id="path5097"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4003"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g5092"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 475.74661,231.4285 -49.00196,-1.11559"
|
||||||
|
id="path5099"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g5092"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3852-5-1"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 543.99527,124.64844 0,0"
|
||||||
|
id="path5101"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g5050"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g5050"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 527.38924,133.86845 390.89158,209.65484"
|
||||||
|
id="path5103"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g5050"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g3852-5-1"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#ff0000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 526.6827,278.24246 541.86801,143.52108"
|
||||||
|
id="path5105"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4003"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g5050"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 253.66397,47.898394 525.63098,119.79378"
|
||||||
|
id="path5107"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3857"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g5050"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||||
|
d="M 202.50001,189.63153 525.33617,128.19907"
|
||||||
|
id="path5109"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g4383"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g5050"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
|
||||||
|
d="m 661.23199,48.860852 0.63865,97.316878"
|
||||||
|
id="path5297"
|
||||||
|
inkscape:connector-type="polyline"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
inkscape:connection-start="#g3852-5-9"
|
||||||
|
inkscape:connection-start-point="d4"
|
||||||
|
inkscape:connection-end="#g5055"
|
||||||
|
inkscape:connection-end-point="d4"
|
||||||
|
transform="translate(-36,-16.351173)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 29 KiB |
@ -3,5 +3,92 @@
|
|||||||
\title Rules
|
\title Rules
|
||||||
|
|
||||||
\annotatedlist rules
|
\annotatedlist rules
|
||||||
|
|
||||||
|
\section1 Introduction
|
||||||
|
|
||||||
|
Rules define all the logic in guh.
|
||||||
|
A rule is composed by a set of \l{Event}{Events}, \l{State}{States} and \l{Action}{Actions}.
|
||||||
|
|
||||||
|
This diagram shows how rules are composed and interpreted by
|
||||||
|
the \l{RuleEngine}.
|
||||||
|
|
||||||
|
\image Rules_definition.svg "Rules definition"
|
||||||
|
|
||||||
|
A basic concept of a \l{Rule} is the trigger path. This is the path that defines when a \l{Rule}
|
||||||
|
is triggered for evaluation. Each element added on a trigger path (either red or blue) has the possibility to trigger the
|
||||||
|
\l{RuleEngine} to evaluate the complete rule and ultimately execute the defined \l{Action}{Actions} if the
|
||||||
|
whole rule evaluates to true. Once the trigger path has been left (i.e. a black arrow is followed),
|
||||||
|
subsequent elements will still be evaluated when the rule is triggered, but they won't trigger the
|
||||||
|
evaluation themselves.
|
||||||
|
|
||||||
|
There are two mechanisms that can trigger a rule, described by the two trigger paths in the Rules definition figure.
|
||||||
|
\list
|
||||||
|
\li State bindings based
|
||||||
|
\li Event based
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
\section2 Event based rules
|
||||||
|
|
||||||
|
Event based rules (trigger path 1) contain either one or more \l{Event}{Events} or are triggered by a \l{State} change (disregarding what
|
||||||
|
the changed State's value actually is). Such rules may still evaluate \l{States}{State} for a certain value (leaving
|
||||||
|
Trigger path 1 and re-entering Trigger path 2), however, unless
|
||||||
|
otherwise explicitly defined, the Rule is not evaluated when such a State change happens (given the Trigger path has been
|
||||||
|
left by crossing a black arrow). Those rules are only executed for items on trigger path 1.
|
||||||
|
|
||||||
|
\section3 Examples
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li This rule will be evaluated and executed whenever Remote_button1 is pressed:
|
||||||
|
|
||||||
|
\tt {\span {id="color-blue"} {Event<Remote_button1_pressed>}} \tt {\span {id="color-black"} {-> Action<Toggle_Light>}}
|
||||||
|
|
||||||
|
\li This rule will be evaluated and executed whenever Remote_button1 is pressed or or Motion sensor 1 triggers.
|
||||||
|
|
||||||
|
\tt {\span {id="color-blue"} {Event<Remote_button1_pressed> | Event<Motion_sensor1_triggered>}} \tt {\span {id="color-black"} {-> Action<Turn_on_Light>}}
|
||||||
|
|
||||||
|
\li This rule will be evaluated and executed whenever Remote_button1 is pressed or the temperature changes.
|
||||||
|
|
||||||
|
\tt {\span {id="color-blue"} {Event<Remote_button1_pressed> | State<Temperature_changed>}} \tt {\span {id="color-black"} {-> Action<Turn_on_Light>}}
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
\section2 State bindings based rules
|
||||||
|
|
||||||
|
State binding rules (Trigger path 2) are rules which only contains \l{State}{States} and \l{Action}{Actions}. Each time
|
||||||
|
a \l{State} on that path changes, the rule is evaluated. That means, all the States in the Rule are examined. If all
|
||||||
|
evaluations are fulfilled, the Rule's \l{Actions}{Action} are executed. Please note, that such Rules may only check
|
||||||
|
if states are equal to, unequal, less than or greater then some value.
|
||||||
|
|
||||||
|
\section3 Examples
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li This rule will be evaluated whenever the temperature changes and executed when the temperature equals 10.
|
||||||
|
|
||||||
|
\tt {\span {id="color-red"} {State<Temperature>==10}} \tt {\span {id="color-black"} {-> Action<Toggle_Light>}}
|
||||||
|
|
||||||
|
\li This rule will be evaluated whenever the temperature changes or the Light sensor changes and executed when the temperature is greater 20 and the light sensor reports values greater 10.
|
||||||
|
|
||||||
|
\tt {\span {id="color-blue"} {State<Temperature> >20 & State<Light> >10}} \tt {\span {id="color-black"} {-> Action<OpenWindow>}}
|
||||||
|
|
||||||
|
\li This rule will be evaluated whenever the temperature changes or the Light sensor changes and executed when the temperature is greater 20 or the light sensor reports values greater 10..
|
||||||
|
|
||||||
|
\tt {\span {id="color-blue"} {State<Temperature> >20 | State<Light> >10}} \tt {\span {id="color-black"} {-> Action<OpenWindow>}}
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
\section2 Mixing rules types
|
||||||
|
|
||||||
|
Having both types of triggers in a single rule is only possible by leaving the trigger path 1, crossing a black arrow and
|
||||||
|
re-entering trigger path 2. This however, converts the rule to an Event based rule which means, only the elements
|
||||||
|
on trigger path 1 will be able to trigger the rule evaluation.
|
||||||
|
|
||||||
|
\section3 Examples
|
||||||
|
|
||||||
|
\list
|
||||||
|
\li This rule will be evaluated whenever the remote button1 is pressed and executed only if the temperature is greater 10.
|
||||||
|
|
||||||
|
\tt {\span {id="color-blue"} {Event<Button1_pressed>==10}} \tt {\span {id="color-black"} {->}} \tt {\span {id="color-red"} {State<Temperature> >10}} \tt {\span {id="color-black"} {-> Action<Toggle_Light>}}
|
||||||
|
|
||||||
|
\endlist
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@ -673,3 +673,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* end of print media */
|
/* end of print media */
|
||||||
|
|
||||||
|
#color-blue { color: blue }
|
||||||
|
#color-red { color: red }
|
||||||
|
|||||||
@ -124,6 +124,7 @@ void Device::setStateValue(const QUuid &stateTypeId, const QVariant &value)
|
|||||||
State newState(stateTypeId, m_id);
|
State newState(stateTypeId, m_id);
|
||||||
newState.setValue(value);
|
newState.setValue(value);
|
||||||
m_states[i] = newState;
|
m_states[i] = newState;
|
||||||
|
emit stateValueChanged(stateTypeId, value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,6 +48,9 @@ public:
|
|||||||
QVariant stateValue(const QUuid &stateTypeId) const;
|
QVariant stateValue(const QUuid &stateTypeId) const;
|
||||||
void setStateValue(const QUuid &stateTypeId, const QVariant &value);
|
void setStateValue(const QUuid &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void stateValueChanged(const QUuid &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Device(const QUuid &pluginId, const QUuid &id, const QUuid &deviceClassId, QObject *parent = 0);
|
Device(const QUuid &pluginId, const QUuid &id, const QUuid &deviceClassId, QObject *parent = 0);
|
||||||
Device(const QUuid &pluginId, const QUuid &deviceClassId, QObject *parent = 0);
|
Device(const QUuid &pluginId, const QUuid &deviceClassId, QObject *parent = 0);
|
||||||
|
|||||||
@ -289,6 +289,15 @@ void DeviceManager::storeConfiguredDevices()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DeviceManager::slotDeviceStateValueChanged(const QUuid &stateTypeId, const QVariant &value)
|
||||||
|
{
|
||||||
|
Device *device = qobject_cast<Device*>(sender());
|
||||||
|
if (!device) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
emit deviceStateChanged(device, stateTypeId, value);
|
||||||
|
}
|
||||||
|
|
||||||
void DeviceManager::radio433SignalReceived(QList<int> rawData)
|
void DeviceManager::radio433SignalReceived(QList<int> rawData)
|
||||||
{
|
{
|
||||||
foreach (Device *device, m_configuredDevices) {
|
foreach (Device *device, m_configuredDevices) {
|
||||||
@ -344,5 +353,6 @@ bool DeviceManager::setupDevice(Device *device)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(device, SIGNAL(stateValueChanged(QUuid,QVariant)), this, SLOT(slotDeviceStateValueChanged(QUuid,QVariant)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -69,6 +69,7 @@ public:
|
|||||||
signals:
|
signals:
|
||||||
void loaded();
|
void loaded();
|
||||||
void emitEvent(const Event &event);
|
void emitEvent(const Event &event);
|
||||||
|
void deviceStateChanged(Device *device, const QUuid &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
DeviceError executeAction(const Action &action);
|
DeviceError executeAction(const Action &action);
|
||||||
@ -78,6 +79,9 @@ private slots:
|
|||||||
void loadConfiguredDevices();
|
void loadConfiguredDevices();
|
||||||
void storeConfiguredDevices();
|
void storeConfiguredDevices();
|
||||||
|
|
||||||
|
// Only connect this to Devices. It will query the sender()
|
||||||
|
void slotDeviceStateValueChanged(const QUuid &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
void radio433SignalReceived(QList<int> rawData);
|
void radio433SignalReceived(QList<int> rawData);
|
||||||
void timerEvent();
|
void timerEvent();
|
||||||
|
|
||||||
|
|||||||
@ -137,7 +137,13 @@ void DevicePluginMock::executeAction(Device *device, const Action &action)
|
|||||||
|
|
||||||
void DevicePluginMock::setState(const QUuid &stateTypeId, const QVariant &value)
|
void DevicePluginMock::setState(const QUuid &stateTypeId, const QVariant &value)
|
||||||
{
|
{
|
||||||
qDebug() << "should set state" << stateTypeId << value;
|
HttpDaemon *daemon = qobject_cast<HttpDaemon*>(sender());
|
||||||
|
if (!daemon) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Device *device = m_daemons.key(daemon);
|
||||||
|
device->setStateValue(stateTypeId, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DevicePluginMock::triggerEvent(const QUuid &id)
|
void DevicePluginMock::triggerEvent(const QUuid &id)
|
||||||
|
|||||||
@ -31,6 +31,7 @@
|
|||||||
#include "jsonrpcserver.h"
|
#include "jsonrpcserver.h"
|
||||||
#include "devicemanager.h"
|
#include "devicemanager.h"
|
||||||
#include "ruleengine.h"
|
#include "ruleengine.h"
|
||||||
|
#include "device.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
@ -78,15 +79,21 @@ GuhCore::GuhCore(QObject *parent) :
|
|||||||
qDebug() << "*****************************************";
|
qDebug() << "*****************************************";
|
||||||
m_jsonServer = new JsonRPCServer(this);
|
m_jsonServer = new JsonRPCServer(this);
|
||||||
|
|
||||||
connect(m_deviceManager, &DeviceManager::emitEvent, this, &GuhCore::gotSignal);
|
connect(m_deviceManager, &DeviceManager::emitEvent, this, &GuhCore::gotEvent);
|
||||||
|
connect(m_deviceManager, &DeviceManager::deviceStateChanged, this, &GuhCore::deviceStateChanged);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Connected to the DeviceManager's emitEvent signal. Events received in
|
/*! Connected to the DeviceManager's emitEvent signal. Events received in
|
||||||
here will be evaluated by the \l{RuleEngine} and the according \l{Action}{Actions} are executed.*/
|
here will be evaluated by the \l{RuleEngine} and the according \l{Action}{Actions} are executed.*/
|
||||||
void GuhCore::gotSignal(const Event &event)
|
void GuhCore::gotEvent(const Event &event)
|
||||||
{
|
{
|
||||||
foreach (const Action &action, m_ruleEngine->evaluateEvent(event)) {
|
foreach (const Action &action, m_ruleEngine->evaluateEvent(event)) {
|
||||||
m_deviceManager->executeAction(action);
|
m_deviceManager->executeAction(action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GuhCore::deviceStateChanged(Device *device, const QUuid &stateTypeId, const QVariant &value)
|
||||||
|
{
|
||||||
|
m_jsonServer->emitStateChangeNotification(device, stateTypeId, value);
|
||||||
|
}
|
||||||
|
|||||||
@ -27,6 +27,7 @@
|
|||||||
class JsonRPCServer;
|
class JsonRPCServer;
|
||||||
class DeviceManager;
|
class DeviceManager;
|
||||||
class RuleEngine;
|
class RuleEngine;
|
||||||
|
class Device;
|
||||||
|
|
||||||
class GuhCore : public QObject
|
class GuhCore : public QObject
|
||||||
{
|
{
|
||||||
@ -46,7 +47,8 @@ private:
|
|||||||
RuleEngine *m_ruleEngine;
|
RuleEngine *m_ruleEngine;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void gotSignal(const Event &event);
|
void gotEvent(const Event &event);
|
||||||
|
void deviceStateChanged(Device *device, const QUuid &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -85,6 +85,23 @@ JsonRPCServer::JsonRPCServer(QObject *parent):
|
|||||||
registerHandler(new RulesHandler(this));
|
registerHandler(new RulesHandler(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JsonRPCServer::emitStateChangeNotification(Device *device, const QUuid &stateTypeId, const QVariant &value)
|
||||||
|
{
|
||||||
|
QVariantMap notification;
|
||||||
|
notification.insert("notification", "Device.StateChanged");
|
||||||
|
|
||||||
|
QVariantMap params;
|
||||||
|
params.insert("deviceId", device->id());
|
||||||
|
params.insert("stateTypeId", stateTypeId);
|
||||||
|
params.insert("value", value);
|
||||||
|
|
||||||
|
notification.insert("params", params);
|
||||||
|
|
||||||
|
QJsonDocument jsonDoc = QJsonDocument::fromVariant(notification);
|
||||||
|
|
||||||
|
m_tcpServer->sendData(m_clients.keys(true), jsonDoc.toJson());
|
||||||
|
}
|
||||||
|
|
||||||
QString JsonRPCServer::name() const
|
QString JsonRPCServer::name() const
|
||||||
{
|
{
|
||||||
return QStringLiteral("JSONRPC");
|
return QStringLiteral("JSONRPC");
|
||||||
@ -92,6 +109,8 @@ QString JsonRPCServer::name() const
|
|||||||
|
|
||||||
QVariantMap JsonRPCServer::Introspect(const QVariantMap ¶ms) const
|
QVariantMap JsonRPCServer::Introspect(const QVariantMap ¶ms) const
|
||||||
{
|
{
|
||||||
|
Q_UNUSED(params)
|
||||||
|
|
||||||
QVariantMap data;
|
QVariantMap data;
|
||||||
data.insert("types", JsonTypes::allTypes());
|
data.insert("types", JsonTypes::allTypes());
|
||||||
QVariantMap methods;
|
QVariantMap methods;
|
||||||
@ -105,6 +124,8 @@ QVariantMap JsonRPCServer::Introspect(const QVariantMap ¶ms) const
|
|||||||
|
|
||||||
QVariantMap JsonRPCServer::Version(const QVariantMap ¶ms) const
|
QVariantMap JsonRPCServer::Version(const QVariantMap ¶ms) const
|
||||||
{
|
{
|
||||||
|
Q_UNUSED(params)
|
||||||
|
|
||||||
QVariantMap data;
|
QVariantMap data;
|
||||||
data.insert("version", "0.0.0");
|
data.insert("version", "0.0.0");
|
||||||
return data;
|
return data;
|
||||||
@ -137,12 +158,14 @@ void JsonRPCServer::processData(const QUuid &clientId, const QByteArray &jsonDat
|
|||||||
int commandId = message.value("id").toInt(&success);
|
int commandId = message.value("id").toInt(&success);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
qWarning() << "Error parsing command. Missing \"id\":" << jsonData;
|
qWarning() << "Error parsing command. Missing \"id\":" << jsonData;
|
||||||
|
sendErrorResponse(clientId, commandId, "Error parsing command. Missing 'id'");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList commandList = message.value("method").toString().split('.');
|
QStringList commandList = message.value("method").toString().split('.');
|
||||||
if (commandList.count() != 2) {
|
if (commandList.count() != 2) {
|
||||||
qWarning() << "Error parsing method.\nGot:" << message.value("method").toString() << "\nExpected: \"Namespace.method\"";
|
qWarning() << "Error parsing method.\nGot:" << message.value("method").toString() << "\nExpected: \"Namespace.method\"";
|
||||||
|
sendErrorResponse(clientId, commandId, QString("Error parsing method. Got: '%1'', Expected: 'Namespace.method'").arg(message.value("method").toString()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -41,6 +41,8 @@ class JsonRPCServer: public JsonHandler
|
|||||||
public:
|
public:
|
||||||
JsonRPCServer(QObject *parent = 0);
|
JsonRPCServer(QObject *parent = 0);
|
||||||
|
|
||||||
|
void emitStateChangeNotification(Device *device, const QUuid &stateTypeId, const QVariant &value);
|
||||||
|
|
||||||
// JsonHandler API implementation
|
// JsonHandler API implementation
|
||||||
QString name() const;
|
QString name() const;
|
||||||
Q_INVOKABLE QVariantMap Introspect(const QVariantMap ¶ms) const;
|
Q_INVOKABLE QVariantMap Introspect(const QVariantMap ¶ms) const;
|
||||||
|
|||||||
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
#include "mocktcpserver.h"
|
#include "mocktcpserver.h"
|
||||||
|
|
||||||
|
#include <QUuid>
|
||||||
|
|
||||||
QList<MockTcpServer*> MockTcpServer::s_allServers;
|
QList<MockTcpServer*> MockTcpServer::s_allServers;
|
||||||
|
|
||||||
MockTcpServer::MockTcpServer(QObject *parent):
|
MockTcpServer::MockTcpServer(QObject *parent):
|
||||||
@ -36,6 +38,13 @@ void MockTcpServer::sendData(const QUuid &clientId, const QByteArray &data)
|
|||||||
emit outgoingData(clientId, data);
|
emit outgoingData(clientId, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MockTcpServer::sendData(const QList<QUuid> &clients, const QByteArray &data)
|
||||||
|
{
|
||||||
|
foreach (const QUuid &clientId, clients) {
|
||||||
|
sendData(clientId, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QList<MockTcpServer *> MockTcpServer::servers()
|
QList<MockTcpServer *> MockTcpServer::servers()
|
||||||
{
|
{
|
||||||
return s_allServers;
|
return s_allServers;
|
||||||
|
|||||||
@ -31,6 +31,7 @@ public:
|
|||||||
~MockTcpServer();
|
~MockTcpServer();
|
||||||
|
|
||||||
void sendData(const QUuid &clientId, const QByteArray &data);
|
void sendData(const QUuid &clientId, const QByteArray &data);
|
||||||
|
void sendData(const QList<QUuid> &clients, const QByteArray &data);
|
||||||
|
|
||||||
/************** Used for testing **************************/
|
/************** Used for testing **************************/
|
||||||
static QList<MockTcpServer*> servers();
|
static QList<MockTcpServer*> servers();
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
if test -z $5; then
|
if test -z $5; then
|
||||||
echo "usage: $0 host sourceDevice eventTypeId targetDeviceId actionTypeId"
|
echo "usage: $0 host sourceDevice eventTypeId targetDeviceId actionTypeId"
|
||||||
else
|
else
|
||||||
(echo '{"id":1, "method":"Rules.AddRule", "params":{"event": {"eventTypeId": "'$3'", "deviceId":"'$2'"}, "actions": [ { "deviceId":"'$4'", "actionTypeId":"'$5'", "params":{"power":"true"}}]}}'; sleep 1) | nc $1 1234
|
(echo '{"id":1, "method":"Rules.AddRule", "params":{"event": {"eventTypeId": "$3", "deviceId":"'$2'"}, "actions": [ { "deviceId":"'$4'", "actionTypeId":"'$5'", "params":{"power":"true"}}]}}'; sleep 1) | nc $1 1234
|
||||||
|
# (echo '{"id":1, "method":"Rules.AddRule", "params":{"event": {"eventTypeId": "'$3'", "deviceId":"'$2'"}, "actions": [ { "deviceId":"'$4'", "actionTypeId":"'$5'", "params":{"power":"true"}}]}}'; sleep 1) | nc $1 1234
|
||||||
# (echo '{"id":1, "method":"Rules.AddRule", "params":{"event": {"eventTypeId": "'$2'", "deviceId":"'$3'", "params":{"power":"false"}}, "actions": [ { "deviceId":"'$4'", "name":"rule 1", "params":{"power":"false"}},{ "deviceId":"'$5'", "name":"rule 1", "params":{"power":"true"}}]}}'; sleep 1) | nc $1 1234
|
# (echo '{"id":1, "method":"Rules.AddRule", "params":{"event": {"eventTypeId": "'$2'", "deviceId":"'$3'", "params":{"power":"false"}}, "actions": [ { "deviceId":"'$4'", "name":"rule 1", "params":{"power":"false"}},{ "deviceId":"'$5'", "name":"rule 1", "params":{"power":"true"}}]}}'; sleep 1) | nc $1 1234
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user