I am working on a home automation node where the imp will be the unit controlling it. I have been looking over multiple other projects using the imp to control one output, but I need it to control multiple.
class MsgInput extends InputPort
{
constructor()
{
base.constructor();
}
function set(value)
{
if (value =="p1s1")
{
hardware.pin1.configure(DIGITAL_OUT_OD_PULLUP);
hardware.pin1.write(0);
server.log("Relay 1: closed");
}
else if (value =="p1s0")
{
hardware.pin1.configure(DIGITAL_OUT_OD_PULLUP);
hardware.pin1.write(1);
server.log("Relay 1: open");
}
hardware.pin9.write(0);
imp.wakeup(0.15, actOff);
}
}
imp.configure(“H.A.Node V0.01a”, [MsgInput], []);
actOff();
checkIn();
hardware.pin9.configure(DIGITAL_OUT_OD_PULLUP);`
This can control pin 1 by sending ?value=p1s1 or p1s0, but is there a way to make it do it for multiple, without having to make a ‘if’ for each of them?
The previous node I made used an arduino and RF to send the string and it then pulled the pin number and state out of it and processed it.
Another reason for this is that I also use it for a garage door, so instead of s for state, I can send it t for trigger, where it then will just pulse once instead of only switching. The last version I made of the arduino powered then also had the option to send it how many pulses with variable interval between.
I havent actually tried it (and have no access to an IMP so I can test the code), but I think it should be possible to do something like this:
Inside the class:
`
OutPin = hardware.pin;
constructor()
{
// You only need to configure pins once
OutPin+1.configure(DIGITAL_OUT_OD_PULLUP);
OutPin+2.configure(DIGITAL_OUT_OD_PULLUP);
OutPin+3.configure(DIGITAL_OUT_OD_PULLUP);
}
function set(pin){
// Missing some sort of validation of the pins written to.
OutPin+pin.write(0);
server.log(format("Relay %d: closed"),pin);
}
function clr(pin){
// Missing some sort of validation of the pins written to.
OutPin+pin.write(1);
server.log(format("Relay %d: open"),pin);
}
`
I don’t remember the exact format of the concatenating of the string and the pin number, but I’m sure I saw it done some time ago. Hopefully others can correct me.
If I totally miss-understood your question, and that you actually want to write to (or read from) more then one pin at one time, then I’d very much like to know, too.
You did understand the question right, but it can’t be done the way you do it, but I can make a function that takes care of that instead. The biggest problem is the thing you also left out, which is how to get the pin number and state out of the string supplied by ‘value’ from http-in.
MikeyDK I drive multiple outputs on April type board simply by sending 10 for o/p1 Off 11 for On. I’m not that bright so I’ve ended up with the code below. I use JQuery mobile as the front End. I’m also about to try some relays with 3v coils but will switch 8amp. Hope it helps.
`// Pins array channel 1 is channelPin[0] in array
local channelPin = [ hardware.pin1, hardware.pin2, hardware.pin5, hardware.pin7, hardware.pin8, hardware.pin9 ];
// Input from web service
class pwsIn extends InputPort
{
name = "wsIn"
type = “number”
function set(value)
{
server.log(“wsIn:”+value);
// Digital outputs
switch(value)
{
case 10: // Ch1 off
channelPin[0].write(0);
break;
case 11: // Ch1 on
channelPin[0].write(1);
break;
case 20: // Ch2 off
channelPin[1].write(0);
break;
case 21: // Ch2 on
channelPin[1].write(1);
break;
case 30: // Ch3 off
channelPin[2].write(0);
break;
case 31: // Ch3 on
channelPin[2].write(1);
break;
}
This would work too, but it isn’t what I am looking for either This also requires me to make one case for each pin and each function for that. What I am looking for is a way to make one case for each function, then be able to apply that function to the set pin.
And about your 3v relay, make sure the pin you are connecting it to can supply the amount of current it needs, and also be sure to have a diode in so the coil in the relay won’t destroy your imp.
Normally you would use the imp to only control and transistor, which would then drive the relay coil. (this one too needs the diode for protecting the transistor)
Ok the way I do that is to build up a string ch1:method:value|ch2:… like poor mans Json then use string split but as you can see I not programmer, noted the rules on the relay been using a 24v ones via a trans but want to see if I can do a battery powered one for very occasional use to reset external devices.
As I already wrote in the initial post, I got a way of setting the settings in a string already. What I need is a way to get the right things out of the string. I can’t find any documentation on how to search in a string and get the index of what is searched for, or how to handle sub-string and pull the found data out.
if output = 0x00 -> all off
if output = 0x01 -> only pin 1 = on
if output = 0x02 -> only pin 2 = on
if output = 0x03 -> only pin 2 and pin 2 = on (=0x01+ 0x02)
if output = 0x04 -> only pin 3 = on
if output = 0x05 -> only pin 1 and pin 3 = on (=0x01+ 0x04)
if output = 0x06 -> only pin 2 and pin 3 = on (=0x02+ 0x04)
…
if output = 0x08 -> only pin 4 = on
…
if output = 0x10 -> only pin 5 = on
…
if output = 0x20 -> only pin 6 = on
…
if output = 0x3f -> all pins = on (= 0x01 + 0x01 + 0x04 + 0x08 +0x10 + 0x20 )
so you can set the state of all pins with one variable (output) in hex value
What you describe also requires one for each pin, even one for each pin configuration. That is way more than I want to put in there, plus it would be a even bigger mess when I get around to also make it do just pulses.
Again, what I need is a way to search a string to get something out of it. I don’t need a way to turn pins on and off because that is only the final thing of the command. I can not make a ‘if’ for each combination, because later it will be impossible. The reason it will be impossible is because I could end up sending p1t5d60 which then would be pin 1 sending a pulse 5 times with 60 seconds delay between those pulses could be everything from 1 to 1000 each with a delay from maybe 1 second to an hour.
I already got this system working with some arduino node’s I made, but I need a way to do it with an Imp. If it is impossible to search in a string (which all other languages I know are capable of), would it then be possible to send more than only ‘value’ to the imp, so I could send ?value=pin&state=1/0 or ?value=pin&trigger=5&delay=60
What you need seems to be this part of the Squirrel 3.0 refs.:
String
len()
returns the string length
tointeger()
converts the string to integer and returns it
tofloat()
converts the string to float and returns it
slice(start,[end])
returns a section of the string as new string. Copies from start to the end (not included). If start is negative the index is calculated as length + start, if end is negative the index is calculated as length + end. If end is omitted end is equal to the string length.
find(substr,[startidx])
search a sub string(substr) starting from the index startidx and returns the index of its first occurrence. If startidx is omitted the search operation starts from the beginning of the string. The function returns null if substr is not found.
I did a search on the forum for “tointeger”, and found the following from Peter:
Yes, this isn't very well-documented in Squirrel. The string.tointeger method is for strings such as "2012"; it's the equivalent of C's atoi() function. The thing you want, to access the byte value of part of a string, is indexing using square brackets [], again like in C, though I can't find it mentioned in the Squirrel manual.
There’s a nice clean example of defining a class and instantiating it with different constructor arguments right here: http://devwiki.electricimp.com/doku.php?id=example:inputport. You might want to use a similar strategy to allow you to just instantiate class objects to manage whatever pins you wind up needing.
Secondly, we’ve got a new feature coming along shortly called agents - they’re a cloud-side partner to the imp firmware. You write agents in squirrel, just like your firmware, but there’s a nice HTTP api for the agents, and they’ll be able to do something else that’ll help you out - they can parse JSON.
Since JSON parsing isn’t there yet, I recently had to manually tear up a response string from wunderground in squirrel and build up a string to go to an 8-char display I built. Lines 25 to 40 here should give you a little boost until the parsing is ready.