# HG changeset patch # User Edouard Tisserant # Date 1598434005 -7200 # Node ID 92101729f7b76328490f19b568be2ee56a9980a0 # Parent da51baea69cb2bd4aa7e7c87157aeef864bc32d3 SVGHMI: Alarm test not using Button widget anymore, too many problems. Use Input widget instead to increment value on each click and execute python code on change. diff -r da51baea69cb -r 92101729f7b7 svghmi/gen_index_xhtml.xslt --- a/svghmi/gen_index_xhtml.xslt Tue Aug 25 14:34:49 2020 +0200 +++ b/svghmi/gen_index_xhtml.xslt Wed Aug 26 11:26:45 2020 +0200 @@ -1496,61 +1496,85 @@ </xsl:text> <xsl:text> </xsl:text> - <xsl:text> on_mouse_down(evt) { -</xsl:text> - <xsl:text> if (this.active_style && this.inactive_style) { -</xsl:text> - <xsl:text> this.active_elt.setAttribute("style", this.active_style); -</xsl:text> - <xsl:text> this.inactive_elt.setAttribute("style", "display:none"); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> this.apply_hmi_value(0, 1); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> on_mouse_up(evt) { -</xsl:text> - <xsl:text> if (this.active_style && this.inactive_style) { -</xsl:text> - <xsl:text> this.active_elt.setAttribute("style", "display:none"); -</xsl:text> - <xsl:text> this.inactive_elt.setAttribute("style", this.inactive_style); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> this.apply_hmi_value(0, 0); -</xsl:text> - <xsl:text> } -</xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> init() { -</xsl:text> - <xsl:text> this.active_style = this.active_elt ? this.active_elt.style.cssText : undefined; -</xsl:text> - <xsl:text> this.inactive_style = this.inactive_elt ? this.inactive_elt.style.cssText : undefined; -</xsl:text> - <xsl:text> + <xsl:text> // TODO decouple update of DOM from event (i.e use animate()) +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> // TODO State of the button should distinguish UI feedbak from current PLC value +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> on_mouse_down(evt) { </xsl:text> <xsl:text> if (this.active_style && this.inactive_style) { </xsl:text> + <xsl:text> console.log("pressedi...") +</xsl:text> + <xsl:text> this.active_elt.setAttribute("style", this.active_style); +</xsl:text> + <xsl:text> this.inactive_elt.setAttribute("style", "display:none"); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> this.apply_hmi_value(0, 1); +</xsl:text> + <xsl:text> console.log("pressed") +</xsl:text> + <xsl:text> // TODO inhibit all mouse/touch events except mouse up (in other word grab cursor) +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> on_mouse_up(evt) { +</xsl:text> + <xsl:text> if (this.active_style && this.inactive_style) { +</xsl:text> + <xsl:text> console.log("unpressedi...") +</xsl:text> <xsl:text> this.active_elt.setAttribute("style", "display:none"); </xsl:text> <xsl:text> this.inactive_elt.setAttribute("style", this.inactive_style); </xsl:text> <xsl:text> } </xsl:text> - <xsl:text> -</xsl:text> - <xsl:text> this.element.setAttribute("onmousedown", "hmi_widgets["+this.element_id+"].on_mouse_down(evt)"); -</xsl:text> - <xsl:text> this.element.setAttribute("onmouseup", "hmi_widgets["+this.element_id+"].on_mouse_up(evt)"); -</xsl:text> - <xsl:text> } + <xsl:text> this.apply_hmi_value(0, 0); +</xsl:text> + <xsl:text> console.log("unpressed") +</xsl:text> + <xsl:text> // TODO release inhibited events +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> init() { +</xsl:text> + <xsl:text> // TODO : move to widget_defs so that we can have generated string literals directly +</xsl:text> + <xsl:text> this.active_style = this.active_elt ? this.active_elt.style.cssText : undefined; +</xsl:text> + <xsl:text> this.inactive_style = this.inactive_elt ? this.inactive_elt.style.cssText : undefined; +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> if (this.active_style && this.inactive_style) { +</xsl:text> + <xsl:text> this.active_elt.setAttribute("style", "display:none"); +</xsl:text> + <xsl:text> this.inactive_elt.setAttribute("style", this.inactive_style); +</xsl:text> + <xsl:text> } +</xsl:text> + <xsl:text> +</xsl:text> + <xsl:text> this.element.setAttribute("onmousedown", "hmi_widgets[\""+this.element_id+"\"].on_mouse_down(evt)"); +</xsl:text> + <xsl:text> this.element.setAttribute("onmouseup", "hmi_widgets[\""+this.element_id+"\"].on_mouse_up(evt)"); +</xsl:text> + <xsl:text> } </xsl:text> <xsl:text>} </xsl:text> @@ -1986,8 +2010,6 @@ </xsl:text> <xsl:text> this.fields[index] = value; </xsl:text> - <xsl:text> console.log(value, index); -</xsl:text> <xsl:text> this.element.textContent = this.args.length == 1 ? vsprintf(this.args[0],this.fields) : this.fields.join(' '); </xsl:text> <xsl:text> } @@ -2825,8 +2847,6 @@ </xsl:text> <xsl:text> } </xsl:text> - <xsl:text> console.log(this.menu_offset); -</xsl:text> <xsl:text> this.set_partial_text(); </xsl:text> <xsl:text> }, @@ -3359,7 +3379,9 @@ </xsl:text> <xsl:text> args: this.args, </xsl:text> - <xsl:text> vars: this.cache + <xsl:text> vars: this.cache, +</xsl:text> + <xsl:text> visible: this.visible </xsl:text> <xsl:text> }; </xsl:text> @@ -3389,8 +3411,6 @@ </xsl:text> <xsl:text> dispatch(value, oldval, index) { </xsl:text> - <xsl:text> console.log("mhooo", index); -</xsl:text> <xsl:text> this.cache[index] = value; </xsl:text> <xsl:text> this.do_http_request(); @@ -3586,11 +3606,69 @@ <xsl:template mode="json_table_render" match="svg:g"> <xsl:param name="expressions"/> <xsl:param name="widget_elts"/> + <xsl:variable name="gid" select="@id"/> + <xsl:variable name="varprefix"> + <xsl:text>obj_</xsl:text> + <xsl:value-of select="$gid"/> + <xsl:text>_</xsl:text> + </xsl:variable> + <xsl:text> try { +</xsl:text> + <xsl:for-each select="$expressions/expression"> + <xsl:text> let </xsl:text> + <xsl:value-of select="$varprefix"/> + <xsl:value-of select="position()"/> + <xsl:text> = </xsl:text> + <xsl:value-of select="@content"/> + <xsl:text>; +</xsl:text> + <xsl:text> if(</xsl:text> + <xsl:value-of select="$varprefix"/> + <xsl:value-of select="position()"/> + <xsl:text> == undefined) { +</xsl:text> + <xsl:text> console.log("</xsl:text> + <xsl:value-of select="$varprefix"/> + <xsl:value-of select="position()"/> + <xsl:text> = </xsl:text> + <xsl:value-of select="@content"/> + <xsl:text>"); +</xsl:text> + <xsl:text> throw null; +</xsl:text> + <xsl:text> } +</xsl:text> + </xsl:for-each> + <xsl:variable name="new_expressions"> + <xsl:for-each select="$expressions/expression"> + <xsl:copy> + <xsl:copy-of select="@name"/> + <xsl:attribute name="content"> + <xsl:value-of select="$varprefix"/> + <xsl:value-of select="position()"/> + </xsl:attribute> + </xsl:copy> + </xsl:for-each> + </xsl:variable> + <xsl:text> id("</xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>").setAttribute("style", "</xsl:text> + <xsl:value-of select="@style"/> + <xsl:text>"); +</xsl:text> <xsl:variable name="label" select="func:filter_non_widget_label(., $widget_elts)"/> <xsl:apply-templates mode="json_table_render" select="*"> - <xsl:with-param name="expressions" select="func:json_expressions($expressions, $label)"/> + <xsl:with-param name="expressions" select="func:json_expressions(exsl:node-set($new_expressions), $label)"/> <xsl:with-param name="widget_elts" select="$widget_elts"/> </xsl:apply-templates> + <xsl:text> } catch(err) { +</xsl:text> + <xsl:text> id("</xsl:text> + <xsl:value-of select="$gid"/> + <xsl:text>").setAttribute("style", "display:none"); +</xsl:text> + <xsl:text> } +</xsl:text> </xsl:template> <xsl:template mode="widget_defs" match="widget[@type='JsonTable']"> <xsl:param name="hmi_element"/> @@ -3608,7 +3686,15 @@ <xsl:with-param name="mandatory" select="'no'"/> </xsl:call-template> <xsl:variable name="data_elt" select="$result_svg_ns//*[@id = $hmi_element/@id]/*[@inkscape:label = 'data']"/> - <xsl:text> spread_json_data: function(jdata) { + <xsl:text> visible: </xsl:text> + <xsl:value-of select="count($data_elt/*[@inkscape:label])"/> + <xsl:text>, +</xsl:text> + <xsl:text> spread_json_data: function(janswer) { +</xsl:text> + <xsl:text> let [range,position,jdata] = janswer; +</xsl:text> + <xsl:text> console.log(range,position,jdata); </xsl:text> <xsl:apply-templates mode="json_table_render" select="$data_elt/*"> <xsl:with-param name="expressions" select="$initexpr_ns"/> @@ -5453,8 +5539,6 @@ </xsl:text> <xsl:text> if(index > last_remote_index){ </xsl:text> - <xsl:text> console.log("updated local variable ",index,value); -</xsl:text> <xsl:text> updates[index] = value; </xsl:text> <xsl:text> requestHMIAnimation(); @@ -5805,8 +5889,6 @@ </xsl:text> <xsl:text> let [keypadid, xcoord, ycoord] = keypads[valuetype]; </xsl:text> - <xsl:text> console.log('XXX TODO : Edit value', path, valuetype, callback, initial, keypadid); -</xsl:text> <xsl:text> edit_callback = callback; </xsl:text> <xsl:text> let widget = hmi_widgets[keypadid]; @@ -5895,8 +5977,6 @@ </xsl:text> <xsl:text> eltsub.active.setAttribute("style", eltsub.active_style); </xsl:text> - <xsl:text> console.log("active", eltsub); -</xsl:text> <xsl:text>}; </xsl:text> <xsl:text>function widget_inactive_activable(eltsub) { @@ -5911,8 +5991,6 @@ </xsl:text> <xsl:text> eltsub.inactive.setAttribute("style", eltsub.inactive_style); </xsl:text> - <xsl:text> console.log("inactive", eltsub); -</xsl:text> <xsl:text>}; </xsl:text> </script> diff -r da51baea69cb -r 92101729f7b7 tests/svghmi/py_ext_0@py_ext/pyfile.xml --- a/tests/svghmi/py_ext_0@py_ext/pyfile.xml Tue Aug 25 14:34:49 2020 +0200 +++ b/tests/svghmi/py_ext_0@py_ext/pyfile.xml Wed Aug 26 11:26:45 2020 +0200 @@ -15,9 +15,8 @@ def TriggerAlarm(changed_var_name): global Alarms - if(getattr(PLCGlobals, changed_var_name)): - Alarms.append((time.time(), PLCGlobals.AlarmText, PLCGlobals.AlarmStatus)) - PLCGlobals.AlarmNotify = random.randint(0, 4294967296) + Alarms.append((time.time(), PLCGlobals.AlarmText, PLCGlobals.AlarmStatus)) + PLCGlobals.AlarmNotify = random.randint(0, 4294967296) class AlarmJsonResource(Resource): def render_GET(self, request): diff -r da51baea69cb -r 92101729f7b7 tests/svghmi/svghmi_0@svghmi/svghmi.svg --- a/tests/svghmi/svghmi_0@svghmi/svghmi.svg Tue Aug 25 14:34:49 2020 +0200 +++ b/tests/svghmi/svghmi_0@svghmi/svghmi.svg Wed Aug 26 11:26:45 2020 +0200 @@ -182,12 +182,12 @@ inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:document-units="px" - inkscape:current-layer="hmi0" + inkscape:current-layer="g1887" showgrid="false" units="px" - inkscape:zoom="0.61756226" - inkscape:cx="494.4152" - inkscape:cy="527.07406" + inkscape:zoom="2.1826319" + inkscape:cx="845.38352" + inkscape:cy="510.70061" inkscape:window-width="1800" inkscape:window-height="836" inkscape:window-x="0" @@ -5775,84 +5775,190 @@ </g> <g style="stroke-width:1.04184687" - inkscape:label="HMI:Button@/SENDALARM" + inkscape:label="HMI:Input@/SENDALARM" id="g953" transform="matrix(0.51020953,0,0,0.5903916,155.46943,-173.35252)"> <g - style="stroke-width:1.04184687" - inkscape:label="bg" - id="g945"> - <rect - rx="26.820074" - inkscape:label="button" - ry="23.177595" - y="594.82263" - x="971.96545" - height="95.723877" - width="245.44583" - id="rect943" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5.20923424;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> - </g> - <g - style="stroke-width:1.04184687" - inkscape:label="text" - id="g951"> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:1.04184675px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="1090.7626" - y="656.98151" - id="text949" - inkscape:label="setting_jmp"><tspan - sodipodi:role="line" - id="tspan947" + id="g1839" + inkscape:label="+1"> + <g + id="g945" + inkscape:label="bg" + style="stroke-width:1.04184687"> + <rect + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:#ff6600;stroke-width:5.20923424;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="rect943" + width="245.44583" + height="95.723877" + x="971.96545" + y="594.82263" + ry="23.177595" + inkscape:label="button" + rx="26.820074" /> + </g> + <g + id="g951" + inkscape:label="text" + style="stroke-width:1.04184687"> + <text + inkscape:label="setting_jmp" + id="text949" + y="656.98151" x="1090.7626" - y="656.98151" - style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:1.04184675px">send</tspan></text> + style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:sans-serif;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;display:inline;fill:#ff6600;fill-opacity:1;stroke:none;stroke-width:1.04184675px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="text-align:center;text-anchor:middle;fill:#ff6600;stroke-width:1.04184675px" + y="656.98151" + x="1090.7626" + id="tspan947" + sodipodi:role="line">send</tspan></text> + </g> </g> </g> <g - transform="matrix(0.28590269,0,0,0.28590269,568.76957,-66.870442)" - inkscape:label="HMI:DropDown:active:warning:normal:ack@/ALARMSTATUS" - id="g1830"> - <rect - inkscape:label="box" - ry="7" - rx="7" - y="923.98993" - x="864.00842" - height="130.9433" - width="391.99988" - id="rect1822" - style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#53676c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + style="stroke-width:2" + inkscape:label="HMI:Input@/ALARMSTATUS" + id="g1887" + transform="matrix(0.28590269,0,0,0.28590269,780.70444,146.1427)"> <text - inkscape:label="text" xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:80px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#d42aff;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - x="881.44226" - y="1011.9975" - id="text1826"><tspan - id="tspan1824" + style="font-style:normal;font-weight:normal;font-size:160px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="136.32812" + y="218.24219" + id="text1843" + inkscape:label="value"><tspan sodipodi:role="line" - x="881.44226" - y="1011.9975" - style="text-align:start;text-anchor:start;fill:#d42aff;stroke-width:1px">sel_0</tspan></text> - <path - inkscape:label="button" - inkscape:transform-center-y="10.92088" - d="m 1200.5,1018.6835 -18.9155,-32.76262 -18.9155,-32.76264 37.831,0 37.831,0 -18.9155,32.76264 z" - inkscape:randomized="0" - inkscape:rounded="0" - inkscape:flatsided="false" - sodipodi:arg2="2.6179939" - sodipodi:arg1="1.5707963" - sodipodi:r2="21.841761" - sodipodi:r1="43.683521" - sodipodi:cy="975" - sodipodi:cx="1200.5" - sodipodi:sides="3" - id="path1828" - style="opacity:1;vector-effect:none;fill:#a7a5a6;fill-opacity:1;stroke:none;stroke-width:0.35277769;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - sodipodi:type="star" /> + id="tspan1841" + x="136.32812" + y="218.24219" + style="stroke-width:2px">8888</tspan></text> + <g + style="stroke-width:2" + id="g1853" + inkscape:label="="ack"" + transform="translate(-346.56635,170.47452)"> + <path + inkscape:connector-curvature="0" + id="path1847" + d="m 797.19546,145.18619 -80.62929,0.60214 -0.60215,-80.629288 80.6293,-0.60214 z" + inkscape:transform-center-y="-14.956361" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" /> + <text + id="text1851" + y="111.05016" + x="733.58197" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="733.58197" + id="tspan1849" + sodipodi:role="line">ack</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1861" + inkscape:label="="disabled"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="21.900597" + inkscape:transform-center-y="-3.6154501e-05" + d="m 622.6459,-170.03172 -51.81035,0 25.90517,-44.86908 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="14.956361" + sodipodi:r1="29.912722" + sodipodi:cy="-184.98808" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path1855" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8.26390171;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" + transform="matrix(0,-2.0000001,2.9285972,0,1233.7513,1298.6541)" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="633.09552" + y="111.05016" + id="text1859"><tspan + sodipodi:role="line" + id="tspan1857" + x="633.09552" + y="111.05016" + style="stroke-width:1px">disabled</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1869" + inkscape:label="="active"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="14.956364" + transform="rotate(-90,746.45698,-44.543641)" + sodipodi:type="star" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + id="path1863" + sodipodi:sides="3" + sodipodi:cx="596.74072" + sodipodi:cy="-216.2599" + sodipodi:r1="59.825443" + sodipodi:r2="29.912722" + sodipodi:arg1="0.52359878" + sodipodi:arg2="1.5707963" + inkscape:flatsided="true" + inkscape:rounded="0" + inkscape:randomized="0" + d="m 648.55108,-186.34718 -103.62071,0 51.81035,-89.73817 z" + inkscape:transform-center-y="-5.9989963e-06" /> + <text + id="text1867" + y="111.05016" + x="537.25018" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="537.25018" + id="tspan1865" + sodipodi:role="line">active</tspan></text> + </g> + <g + style="stroke-width:2" + id="g1877" + inkscape:label="="alarm"" + transform="translate(-416.52022,170.47452)"> + <path + inkscape:transform-center-x="-14.956365" + transform="matrix(0,-1,-1,0,1043.9134,701.91334)" + inkscape:transform-center-y="-5.5023185e-06" + d="m 648.55108,135.08534 -103.62071,0 51.81035,-89.738161 z" + inkscape:randomized="0" + inkscape:rounded="0" + inkscape:flatsided="true" + sodipodi:arg2="1.5707963" + sodipodi:arg1="0.52359878" + sodipodi:r2="29.912722" + sodipodi:r1="59.825443" + sodipodi:cy="105.17262" + sodipodi:cx="596.74072" + sodipodi:sides="3" + id="path1871" + style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#e6e6e6;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" + sodipodi:type="star" /> + <text + id="text1875" + y="111.05016" + x="925.82605" + style="font-style:normal;font-weight:normal;font-size:20px;line-height:125%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + xml:space="preserve"><tspan + style="stroke-width:1px" + y="111.05016" + x="925.82605" + id="tspan1873" + sodipodi:role="line">alarm</tspan></text> + </g> </g> </svg>