Categories
Electronics ESP8266 Home Automation Open Hardware Open Source

Nice project: Swifitch

https://github.com/ArnieX/swifitch

Categories
General HowTo's VSCP

#VSCP HOWTO: DM Check measurement

In another Howto we looked at the measurement compares that are available in the decision matrix (DM) record (VSCP HOWTO: COMPARE VALUES WITHOUT CODING). Here we will look at an action that work in a similar equal manner.

The check measurement action

VSCP_DAEMON_ACTION_CODE_CHECK_MEASUREMENT

is defined to make it possible to check a measurement against a literal value and just as we described in the howto about the check variable actions it stores the logical outcome of the compare in a boolean remote variable.

Also here equal to, less than, greater than etc is available.  A typical parameter row can look like this

0;0;99.5;gt;flag

This says that if a measurement comes in that have a value that is greater than 99.5 the remote variable “flag” will be set to true. In all other cases “flag” will be set to “false”.  The “0;0” that is the first two values of the parameter line is  unit and sensor index. In this case the measurement therefore must have unit=0 and sensor index = 0 as well for the test to be evaluated at all.

A complete example is available in the documentation of the action. You can find pre written samples here.

As a note. Instead of a literal value for the compare you can use another variable.  The parameter above can be rewritten

0;0;%variable:[critical_value];gt;flag

and instead of the literal “99.5” the value of the remote variable 99.5 is used for the compare.  VSCP DM escapes are evaluated before an action is carried out. There is many of them and they can be very useful when you want to make decision matrix rows act in a more dynamic way without go so far as to use full JavaScript or Lua.  You can read more about the VSCP DM escapes here.

It isn’t harder than that actually.

Categories
HowTo's VSCP

#VSCP HOWTO: DM – Check variables – store result

A common operation handling flowing data and measurements  is to compare results and the decision matrix (DM) has plenty of functionality built-in for this. Here we will look at three of the actions available for this.

They are

Check variable, set variable
VSCP_DAEMON_ACTION_CODE_CHECK_VARIABLE
Check variable, set to true
VSCP_DAEMON_ACTION_CODE_CHECK_VARIABLE_TRUE
Check variable, set to false
VSCP_DAEMON_ACTION_CODE_CHECK_VARIABLE_FALSE

What they all do is to compare (less than, greater than equal etc) a literal value with the content of a remote variable  and they

Check variable, set variable

This action check the value of a variable against a literal and the set the named boolean remote variable to the outcome of the logic operation. So

3.14;eq;pi;myflag

will set the remote variable myflag to true if the remote variable pi is equal to 3.14 (false otherwise) and

32;lt;temp;alarm

will set the boolean remote variable alarm to true when the remote variable alarm have a value that is greater than 32 and to false otherwise.. The last will look like this in its complete form

<row enable="true" groupid="Variable compare" >

<comment>
 Test the variables tamp if its greater than 32 
 every second
</comment>

<mask priority="0" 
 class="0xFFFF" 
 type="0xFFFF" 
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<filter priority="0" 
 class="65535" 
 type="5" 
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<action>0x58</action>
 <param>
 32;lt;temp;alarm
 </param>

</row>

Check variable, set to true

This is just a variant of the above. Instead of the result of the logical compare true is always stored when the calculated result is true.

So the example above

32;lt;temp;alarm

will no actually do the same as before. If the result is true it stores true and false if not.

Check variable, set to false

Another variant of the same. Instead of the result of the logical compare false is always stored when the calculated result is true.

So for the example above

32;lt;temp;alarm

alarm will be false when temp is greater than 32 and vice versa.

————————————————————————————

Some ready-made test code is available here.

 

.

Categories
HowTo's VSCP

#VSCP HOWTO: Min/max

Quite often one want to store min and max for measurement values  So of course you can do that with the VSCP server just by adding a row to the decision matrix.

The first thing you need is a remote variable to store the min/max in. You can add this remote variable to the variable xml file so it is created when the system starts or add it as a persistent variable to the database. Another way is to create the variable when the server starts right is the DM. We  use the last method here as it is makes things clearer in this how-to.

You can create a remote variable minimum and another maximum with the following two DM rows which triggers on the CLASS2.VSCPD, Type=23 Starting up  which is feed to the DM once when the VSCP server is started. .

<row enable="true" groupid="Min/max" >

<comment>
 Create variable that hold min
 when the server is started 
 ( CLASS2.VSCPD, Type=23 ).
 </comment>

<mask priority="0"
 class="0xFFFF"
 type="0xFFFF"
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<filter priority="0"
 class="65535"
 type="23"
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<action>0x50</action>
 <param>
 minimum;float;false;0;0x777;9999999;BASE64:test min
 </param>

</row>
 
 <row enable="true" groupid="Min/max" >

<comment>
 Create variable that hold min
 when the server is started ( CLASS2.VSCPD, Type=23 ).
 </comment>

<mask priority="0"
 class="0xFFFF"
 type="0xFFFF"
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<filter priority="0"
 class="65535"
 type="23"
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<action>0x50</action>
 <param>
 maximum;float;false;0;0x777;-999999;BASE64:test max
 </param>

</row>

Here the  minimum variable is created as a non-persistent variable (it will not hold its value between sessions), it is created as a float and initiated to a “very high” value (9999999), The maximum variable is also created as a float and initiated to a “very low” number (-999999).

You can read more about the store remote variable action here.

The values for the minimum and maximum variables is selected so that minimum is initiated to a value that is higher than what is expected to be a lowest value that will be received by the system and the same for the maximum but the other way around.

So no we have the two variables. Suppose we now want to check the maximum and minimums for a temperature.  This means that we will look for a measurement event  with type = 6 temperature.  I write “measurement event” here as they come in a couple of flavors.  A DM row  like the following will handle the collection of minimum data

<row enable="true" groupid="Min/max" >

<comment>
 Test for minimum
 </comment>

<mask priority="0" 
 class="0xFFFF" 
 type="0xFFFF" 
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<filter priority="0" 
 class="10" 
 type="6" 
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<action>0x71</action>
 <param>
 minimum;1;1
 </param>

</row>

Here we filter on CLASS1.MEASUREMENT, Type=6 temperature (class=10, type=6) from any sensor (we normally should have selected on by entering a GUID for it).  The action 0x71 is the

VSCP_DAEMON_ACTION_CODE_STORE_MIN

and it will store the temperature value of the incoming VSCP event if it is lower than the value currently stored in the remote variable minimum. The 1,1 after the variable name  in the parameter says that the measurement should have unit=1 (Celsius in this case) and originate from sensor with index=1 on the remote node,

For the maximum the DM row looks like

<row enable="true" groupid="Min/max" >

<comment>
 Test for maximum
 </comment>

<mask priority="0" 
 class="0xFFFF" 
 type="0xFFFF" 
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<filter priority="0" 
 class="10" 
 type="6" 
 GUID=" 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00" />

<action>0x72</action>
 <param>
 maximum;1;1
 </param>

</row>

The functionality is the same except that the

VSCP_DAEMON_ACTION_CODE_STORE_MAX

action is used here which compares the names variable for a highest value instead of a lowest value.

That it. We now have to variables maximum and minimum that  holds the maximum and minimum values for the temperature. We can read (and write) this value in all the interfaces, tcp/op, websocket, mqtt, REST etc and use it for other calculations or present it in a UI. With websocket this presentation is actual trivial using one of the ready-made widgets.

Also not that this work s for all measurement units (that is all SI defined and derived units)  in the same way.  No coding needed.

One last thing. Suppose you want to daily maximum/minimum instead of an all time maximum/minimum.  Easy

Add a DM row that triggers on

CLASS2.VSCPD, Type=9 Midnight

and store  the “very low”/”very high” value to the minimum. It is harder than that. In the same way you can do this on a weekly, monthly etc basis.

You can also use the escapes to  create a more dynamic variable that store the daily minimum/maximum. Try a store in variable

minimum-%isodate;float;true;0;0x777;%variable:[minimum]

which is set to trigger just before midnight. What you get here is a remote variable minimum-YYMMDD  where YYMMDD is the current date that is persistent and holds the value of the minimum remote variable collected for that date.

Try that with the rest..