diff --git a/scripts/upd_status.sh.d/.gitignore b/.gitignore similarity index 52% rename from scripts/upd_status.sh.d/.gitignore rename to .gitignore index ff8cd31..6ef556d 100644 --- a/scripts/upd_status.sh.d/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ twittertokens.php +spaceapikey.txt diff --git a/rcswitch-pi/Makefile b/rcswitch-pi/Makefile new file mode 100644 index 0000000..ad04124 --- /dev/null +++ b/rcswitch-pi/Makefile @@ -0,0 +1,9 @@ +all: send + +send: RCSwitch.o send.o + $(CXX) $(CXXFLAGS) $(LDFLAGS) $+ -o $@ -lwiringPi + +rawsend: RCSwitch.o rawsend.o + $(CXX) $(CXXFLAGS) $(LDFLAGS) $+ -o $@ -lwiringPi +clean: + $(RM) *.o send rawsend diff --git a/rcswitch-pi/RCSwitch.cpp b/rcswitch-pi/RCSwitch.cpp new file mode 100644 index 0000000..4ce4df9 --- /dev/null +++ b/rcswitch-pi/RCSwitch.cpp @@ -0,0 +1,583 @@ +/* + RCSwitch - Arduino libary for remote control outlet switches + Copyright (c) 2011 Suat Özgür. All right reserved. + + Contributors: + - Andre Koehler / info(at)tomate-online(dot)de + - Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com + - Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=48 + + Project home: http://code.google.com/p/rc-switch/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "RCSwitch.h" + +unsigned long RCSwitch::nReceivedValue = NULL; +unsigned int RCSwitch::nReceivedBitlength = 0; +unsigned int RCSwitch::nReceivedDelay = 0; +unsigned int RCSwitch::nReceivedProtocol = 0; +unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES]; +int RCSwitch::nReceiveTolerance = 60; + +RCSwitch::RCSwitch() { + this->nReceiverInterrupt = -1; + this->nTransmitterPin = -1; + RCSwitch::nReceivedValue = NULL; + this->setPulseLength(350); + this->setRepeatTransmit(10); + this->setReceiveTolerance(60); + this->setProtocol(1); +} + +/** + * Sets the protocol to send. + */ +void RCSwitch::setProtocol(int nProtocol) { + this->nProtocol = nProtocol; + if (nProtocol == 1){ + this->setPulseLength(350); + } + else if (nProtocol == 2) { + this->setPulseLength(650); + } +} + +/** + * Sets the protocol to send with pulse length in microseconds. + */ +void RCSwitch::setProtocol(int nProtocol, int nPulseLength) { + this->nProtocol = nProtocol; + if (nProtocol == 1){ + this->setPulseLength(nPulseLength); + } + else if (nProtocol == 2) { + this->setPulseLength(nPulseLength); + } +} + + +/** + * Sets pulse length in microseconds + */ +void RCSwitch::setPulseLength(int nPulseLength) { + this->nPulseLength = nPulseLength; +} + +/** + * Sets Repeat Transmits + */ +void RCSwitch::setRepeatTransmit(int nRepeatTransmit) { + this->nRepeatTransmit = nRepeatTransmit; +} + +/** + * Set Receiving Tolerance + */ +void RCSwitch::setReceiveTolerance(int nPercent) { + RCSwitch::nReceiveTolerance = nPercent; +} + + +/** + * Enable transmissions + * + * @param nTransmitterPin Arduino Pin to which the sender is connected to + */ +void RCSwitch::enableTransmit(int nTransmitterPin) { + this->nTransmitterPin = nTransmitterPin; + pinMode(this->nTransmitterPin, OUTPUT); +} + +/** + * Disable transmissions + */ +void RCSwitch::disableTransmit() { + this->nTransmitterPin = -1; +} + +/** + * Switch a remote switch on (Type C Intertechno) + * + * @param sFamily Familycode (a..f) + * @param nGroup Number of group (1..4) + * @param nDevice Number of device (1..4) + */ +void RCSwitch::switchOn(char sFamily, int nGroup, int nDevice) { + this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, true) ); +} + +/** + * Switch a remote switch off (Type C Intertechno) + * + * @param sFamily Familycode (a..f) + * @param nGroup Number of group (1..4) + * @param nDevice Number of device (1..4) + */ +void RCSwitch::switchOff(char sFamily, int nGroup, int nDevice) { + this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, false) ); +} + +/** + * Switch a remote switch on (Type B with two rotary/sliding switches) + * + * @param nAddressCode Number of the switch group (1..4) + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOn(int nAddressCode, int nChannelCode) { + this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, true) ); +} + +/** + * Switch a remote switch off (Type B with two rotary/sliding switches) + * + * @param nAddressCode Number of the switch group (1..4) + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOff(int nAddressCode, int nChannelCode) { + this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, false) ); +} + +/** + * Switch a remote switch on (Type A with 10 pole DIP switches) + * + * @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111") + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOn(char* sGroup, int nChannel) { + this->sendTriState( this->getCodeWordA(sGroup, nChannel, true) ); +} + +/** + * Switch a remote switch off (Type A with 10 pole DIP switches) + * + * @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111") + * @param nChannelCode Number of the switch itself (1..4) + */ +void RCSwitch::switchOff(char* sGroup, int nChannel) { + this->sendTriState( this->getCodeWordA(sGroup, nChannel, false) ); +} + +/** + * Returns a char[13], representing the Code Word to be send. + * A Code Word consists of 9 address bits, 3 data bits and one sync bit but in our case only the first 8 address bits and the last 2 data bits were used. + * A Code Bit can have 4 different states: "F" (floating), "0" (low), "1" (high), "S" (synchronous bit) + * + * +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+ + * | 4 bits address (switch group) | 4 bits address (switch number) | 1 bit address (not used, so never mind) | 1 bit address (not used, so never mind) | 2 data bits (on|off) | 1 sync bit | + * | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | F | F | on=FF off=F0 | S | + * +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+ + * + * @param nAddressCode Number of the switch group (1..4) + * @param nChannelCode Number of the switch itself (1..4) + * @param bStatus Wether to switch on (true) or off (false) + * + * @return char[13] + */ +char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, boolean bStatus) { + int nReturnPos = 0; + static char sReturn[13]; + + char* code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" }; + if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) { + return '\0'; + } + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = code[nAddressCode][i]; + } + + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = code[nChannelCode][i]; + } + + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = 'F'; + + if (bStatus) { + sReturn[nReturnPos++] = 'F'; + } else { + sReturn[nReturnPos++] = '0'; + } + + sReturn[nReturnPos] = '\0'; + + return sReturn; +} + + +/** + * Like getCodeWord (Type A) + */ +char* RCSwitch::getCodeWordA(char* sGroup, int nChannelCode, boolean bStatus) { + int nReturnPos = 0; + static char sReturn[13]; + + char* code[6] = { "FFFFF", "0FFFF", "F0FFF", "FF0FF", "FFF0F", "FFFF0" }; + + if (nChannelCode < 1 || nChannelCode > 5) { + return '\0'; + } + + for (int i = 0; i<5; i++) { + if (sGroup[i] == '0') { + sReturn[nReturnPos++] = 'F'; + } else if (sGroup[i] == '1') { + sReturn[nReturnPos++] = '0'; + } else { + return '\0'; + } + } + + for (int i = 0; i<5; i++) { + sReturn[nReturnPos++] = code[ nChannelCode ][i]; + } + + if (bStatus) { + sReturn[nReturnPos++] = '0'; + sReturn[nReturnPos++] = 'F'; + } else { + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = '0'; + } + sReturn[nReturnPos] = '\0'; + + return sReturn; +} + +/** + * Like getCodeWord (Type C = Intertechno) + */ +char* RCSwitch::getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus) { + static char sReturn[13]; + int nReturnPos = 0; + + if ( (byte)sFamily < 97 || (byte)sFamily > 112 || nGroup < 1 || nGroup > 4 || nDevice < 1 || nDevice > 4) { + return '\0'; + } + + char* sDeviceGroupCode = dec2binWzerofill( (nDevice-1) + (nGroup-1)*4, 4 ); + char familycode[16][5] = { "0000", "F000", "0F00", "FF00", "00F0", "F0F0", "0FF0", "FFF0", "000F", "F00F", "0F0F", "FF0F", "00FF", "F0FF", "0FFF", "FFFF" }; + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = familycode[ (int)sFamily - 97 ][i]; + } + for (int i = 0; i<4; i++) { + sReturn[nReturnPos++] = (sDeviceGroupCode[3-i] == '1' ? 'F' : '0'); + } + sReturn[nReturnPos++] = '0'; + sReturn[nReturnPos++] = 'F'; + sReturn[nReturnPos++] = 'F'; + if (bStatus) { + sReturn[nReturnPos++] = 'F'; + } else { + sReturn[nReturnPos++] = '0'; + } + sReturn[nReturnPos] = '\0'; + return sReturn; +} + +/** + * Sends a Code Word + * @param sCodeWord /^[10FS]*$/ -> see getCodeWord + */ +void RCSwitch::sendTriState(char* sCodeWord) { + for (int nRepeat=0; nRepeatsendT0(); + break; + case 'F': + this->sendTF(); + break; + case '1': + this->sendT1(); + break; + } + i++; + } + this->sendSync(); + } +} + +void RCSwitch::send(unsigned long Code, unsigned int length) { + this->send( this->dec2binWzerofill(Code, length) ); +} + +void RCSwitch::send(char* sCodeWord) { + for (int nRepeat=0; nRepeatsend0(); + break; + case '1': + this->send1(); + break; + } + i++; + } + this->sendSync(); + } +} + +void RCSwitch::transmit(int nHighPulses, int nLowPulses) { + boolean disabled_Receive = false; + int nReceiverInterrupt_backup = nReceiverInterrupt; + if (this->nTransmitterPin != -1) { + if (this->nReceiverInterrupt != -1) { + this->disableReceive(); + disabled_Receive = true; + } + digitalWrite(this->nTransmitterPin, HIGH); + delayMicroseconds( this->nPulseLength * nHighPulses); + digitalWrite(this->nTransmitterPin, LOW); + delayMicroseconds( this->nPulseLength * nLowPulses); + if(disabled_Receive){ + this->enableReceive(nReceiverInterrupt_backup); + } + } +} +/** + * Sends a "0" Bit + * _ + * Waveform Protocol 1: | |___ + * _ + * Waveform Protocol 2: | |__ + */ +void RCSwitch::send0() { + if (this->nProtocol == 1){ + this->transmit(1,3); + } + else if (this->nProtocol == 2) { + this->transmit(1,2); + } +} + +/** + * Sends a "1" Bit + * ___ + * Waveform Protocol 1: | |_ + * __ + * Waveform Protocol 2: | |_ + */ +void RCSwitch::send1() { + if (this->nProtocol == 1){ + this->transmit(3,1); + } + else if (this->nProtocol == 2) { + this->transmit(2,1); + } +} + + +/** + * Sends a Tri-State "0" Bit + * _ _ + * Waveform: | |___| |___ + */ +void RCSwitch::sendT0() { + this->transmit(1,3); + this->transmit(1,3); +} + +/** + * Sends a Tri-State "1" Bit + * ___ ___ + * Waveform: | |_| |_ + */ +void RCSwitch::sendT1() { + this->transmit(3,1); + this->transmit(3,1); +} + +/** + * Sends a Tri-State "F" Bit + * _ ___ + * Waveform: | |___| |_ + */ +void RCSwitch::sendTF() { + this->transmit(1,3); + this->transmit(3,1); +} + +/** + * Sends a "Sync" Bit + * _ + * Waveform Protocol 1: | |_______________________________ + * _ + * Waveform Protocol 2: | |__________ + */ +void RCSwitch::sendSync() { + + if (this->nProtocol == 1){ + this->transmit(1,31); + } + else if (this->nProtocol == 2) { + this->transmit(1,10); + } +} + +/** + * Enable receiving data + */ +void RCSwitch::enableReceive(int interrupt) { + this->nReceiverInterrupt = interrupt; + this->enableReceive(); +} + +void RCSwitch::enableReceive() { + if (this->nReceiverInterrupt != -1) { + RCSwitch::nReceivedValue = NULL; + RCSwitch::nReceivedBitlength = NULL; + } +} + +/** + * Disable receiving data + */ +void RCSwitch::disableReceive() { + this->nReceiverInterrupt = -1; +} + +bool RCSwitch::available() { + return RCSwitch::nReceivedValue != NULL; +} + +void RCSwitch::resetAvailable() { + RCSwitch::nReceivedValue = NULL; +} + +unsigned long RCSwitch::getReceivedValue() { + return RCSwitch::nReceivedValue; +} + +unsigned int RCSwitch::getReceivedBitlength() { + return RCSwitch::nReceivedBitlength; +} + +unsigned int RCSwitch::getReceivedDelay() { + return RCSwitch::nReceivedDelay; +} + +unsigned int RCSwitch::getReceivedProtocol() { + return RCSwitch::nReceivedProtocol; +} + +unsigned int* RCSwitch::getReceivedRawdata() { + return RCSwitch::timings; +} + +/** + * + */ +bool RCSwitch::receiveProtocol1(unsigned int changeCount){ + + unsigned long code = 0; + unsigned long delay = RCSwitch::timings[0] / 31; + unsigned long delayTolerance = delay * RCSwitch::nReceiveTolerance * 0.01; + + for (int i = 1; i delay-delayTolerance && RCSwitch::timings[i] < delay+delayTolerance && RCSwitch::timings[i+1] > delay*3-delayTolerance && RCSwitch::timings[i+1] < delay*3+delayTolerance) { + code = code << 1; + } else if (RCSwitch::timings[i] > delay*3-delayTolerance && RCSwitch::timings[i] < delay*3+delayTolerance && RCSwitch::timings[i+1] > delay-delayTolerance && RCSwitch::timings[i+1] < delay+delayTolerance) { + code+=1; + code = code << 1; + } else { + // Failed + i = changeCount; + code = 0; + } + } + code = code >> 1; + if (changeCount > 6) { // ignore < 4bit values as there are no devices sending 4bit values => noise + RCSwitch::nReceivedValue = code; + RCSwitch::nReceivedBitlength = changeCount / 2; + RCSwitch::nReceivedDelay = delay; + RCSwitch::nReceivedProtocol = 1; + } + + if (code == 0){ + return false; + }else if (code != 0){ + return true; + } + + +} + +bool RCSwitch::receiveProtocol2(unsigned int changeCount){ + + unsigned long code = 0; + unsigned long delay = RCSwitch::timings[0] / 10; + unsigned long delayTolerance = delay * RCSwitch::nReceiveTolerance * 0.01; + + for (int i = 1; i delay-delayTolerance && RCSwitch::timings[i] < delay+delayTolerance && RCSwitch::timings[i+1] > delay*2-delayTolerance && RCSwitch::timings[i+1] < delay*2+delayTolerance) { + code = code << 1; + } else if (RCSwitch::timings[i] > delay*2-delayTolerance && RCSwitch::timings[i] < delay*2+delayTolerance && RCSwitch::timings[i+1] > delay-delayTolerance && RCSwitch::timings[i+1] < delay+delayTolerance) { + code+=1; + code = code << 1; + } else { + // Failed + i = changeCount; + code = 0; + } + } + code = code >> 1; + if (changeCount > 6) { // ignore < 4bit values as there are no devices sending 4bit values => noise + RCSwitch::nReceivedValue = code; + RCSwitch::nReceivedBitlength = changeCount / 2; + RCSwitch::nReceivedDelay = delay; + RCSwitch::nReceivedProtocol = 2; + } + + if (code == 0){ + return false; + }else if (code != 0){ + return true; + } + +} + +/** + * Turns a decimal value to its binary representation + */ +char* RCSwitch::dec2binWzerofill(unsigned long Dec, unsigned int bitLength){ + static char bin[64]; + unsigned int i=0; + + while (Dec > 0) { + bin[32+i++] = ((Dec & 1) > 0) ? '1' : '0'; + Dec = Dec >> 1; + } + + for (unsigned int j = 0; j< bitLength; j++) { + if (j >= bitLength - i) { + bin[j] = bin[ 31 + i - (j - (bitLength - i)) ]; + }else { + bin[j] = '0'; + } + } + bin[bitLength] = '\0'; + + return bin; +} + diff --git a/rcswitch-pi/RCSwitch.h b/rcswitch-pi/RCSwitch.h new file mode 100644 index 0000000..f762ebc --- /dev/null +++ b/rcswitch-pi/RCSwitch.h @@ -0,0 +1,123 @@ +/* + RCSwitch - Arduino libary for remote control outlet switches + Copyright (c) 2011 Suat Özgür. All right reserved. + + Contributors: + - Andre Koehler / info(at)tomate-online(dot)de + - Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com + + Project home: http://code.google.com/p/rc-switch/ + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#ifndef _RCSwitch_h +#define _RCSwitch_h + +#if defined(ARDUINO) && ARDUINO >= 100 + #include "Arduino.h" +#else + #include + #include + #define NULL 0 + #define CHANGE 1 +#ifdef __cplusplus +extern "C"{ +#endif +typedef uint8_t boolean; +typedef uint8_t byte; + +#if !defined(NULL) +#endif +#ifdef __cplusplus +} +#endif +#endif + + +// Number of maximum High/Low changes per packet. +// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync +#define RCSWITCH_MAX_CHANGES 67 + + +class RCSwitch { + + public: + RCSwitch(); + + void switchOn(int nGroupNumber, int nSwitchNumber); + void switchOff(int nGroupNumber, int nSwitchNumber); + void switchOn(char* sGroup, int nSwitchNumber); + void switchOff(char* sGroup, int nSwitchNumber); + void switchOn(char sFamily, int nGroup, int nDevice); + void switchOff(char sFamily, int nGroup, int nDevice); + + void sendTriState(char* Code); + void send(unsigned long Code, unsigned int length); + void send(char* Code); + + void enableReceive(int interrupt); + void enableReceive(); + void disableReceive(); + bool available(); + void resetAvailable(); + + unsigned long getReceivedValue(); + unsigned int getReceivedBitlength(); + unsigned int getReceivedDelay(); + unsigned int getReceivedProtocol(); + unsigned int* getReceivedRawdata(); + + void enableTransmit(int nTransmitterPin); + void disableTransmit(); + void setPulseLength(int nPulseLength); + void setRepeatTransmit(int nRepeatTransmit); + void setReceiveTolerance(int nPercent); + void setProtocol(int nProtocol); + void setProtocol(int nProtocol, int nPulseLength); + + private: + char* getCodeWordB(int nGroupNumber, int nSwitchNumber, boolean bStatus); + char* getCodeWordA(char* sGroup, int nSwitchNumber, boolean bStatus); + char* getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus); + void sendT0(); + void sendT1(); + void sendTF(); + void send0(); + void send1(); + void sendSync(); + void transmit(int nHighPulses, int nLowPulses); + + static char* dec2binWzerofill(unsigned long dec, unsigned int length); + + static void handleInterrupt(); + static bool receiveProtocol1(unsigned int changeCount); + static bool receiveProtocol2(unsigned int changeCount); + int nReceiverInterrupt; + int nTransmitterPin; + int nPulseLength; + int nRepeatTransmit; + char nProtocol; + + static int nReceiveTolerance; + static unsigned long nReceivedValue; + static unsigned int nReceivedBitlength; + static unsigned int nReceivedDelay; + static unsigned int nReceivedProtocol; + static unsigned int timings[RCSWITCH_MAX_CHANGES]; + + +}; + +#endif diff --git a/rcswitch-pi/RCSwitch.o b/rcswitch-pi/RCSwitch.o new file mode 100644 index 0000000..320d42e Binary files /dev/null and b/rcswitch-pi/RCSwitch.o differ diff --git a/rcswitch-pi/README.md b/rcswitch-pi/README.md new file mode 100644 index 0000000..9b99a59 --- /dev/null +++ b/rcswitch-pi/README.md @@ -0,0 +1,14 @@ +# About + +rcswitch-pi is for controlling rc remote controlled power sockets +with the raspberry pi. Kudos to the projects [rc-switch](http://code.google.com/p/rc-switch) +and [wiringpi](https://projects.drogon.net/raspberry-pi/wiringpi). +I just adapted the rc-switch code to use the wiringpi library instead of +the library provided by the arduino. + + +## Usage + +First you have to install the [wiringpi](https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/) library. +After that you can compile the example program *send* by executing *make*. +You may want to changet the used GPIO pin before compilation in the send.cpp source file. diff --git a/rcswitch-pi/down.raw b/rcswitch-pi/down.raw new file mode 100644 index 0000000..4dce7e0 --- /dev/null +++ b/rcswitch-pi/down.raw @@ -0,0 +1 @@ +11111101000110010000100010100010000100000000100000000001001001001110010000000000000000000000000 diff --git a/rcswitch-pi/on b/rcswitch-pi/on new file mode 100644 index 0000000..409ad7e --- /dev/null +++ b/rcswitch-pi/on @@ -0,0 +1,6 @@ +./send 2 1A 1 1 + +off +./send 2 1A 1 0 + + diff --git a/rcswitch-pi/rawsend b/rcswitch-pi/rawsend new file mode 100755 index 0000000..530bc10 Binary files /dev/null and b/rcswitch-pi/rawsend differ diff --git a/rcswitch-pi/rawsend.cpp b/rcswitch-pi/rawsend.cpp new file mode 100644 index 0000000..d7784a6 --- /dev/null +++ b/rcswitch-pi/rawsend.cpp @@ -0,0 +1,49 @@ +/* + Usage: ./send + bitlen is in microsecond + Command is 0 for OFF and 1 for ON + */ + +#include "RCSwitch.h" +#include +#include +#include + +int main(int argc, char *argv[]) { + + /* + output PIN is hardcoded for testing purposes + see https://projects.drogon.net/raspberry-pi/wiringpi/pins/ + for pin mapping of the raspberry pi GPIO connector + */ + int PIN = 2; // GPIO-PIN 17 + char pSystemCode[14]; + int bitlen=atoi(argv[1]); + char* sendptr=argv[2]; + + if (wiringPiSetup () == -1) return 1; + printf("sending with bitlength %d the data %s ...\n", bitlen, argv[2]); + RCSwitch mySwitch = RCSwitch(); + printf("defining transmit PIN[%i] ... ",PIN); + mySwitch.enableTransmit(PIN); + printf("success\n"); + + + int i=0; + while(sendptr[i]!= (char)0) + { + printf("%c",sendptr[i]); + fflush(stdout); + if(sendptr[i] == '0') + { + digitalWrite(PIN, LOW); + } + if(sendptr[i] == '1') + { + digitalWrite(PIN, HIGH); + } + delayMicroseconds( bitlen ); + i++; + } + printf("\ndone\n"); +} diff --git a/rcswitch-pi/rawsend.o b/rcswitch-pi/rawsend.o new file mode 100644 index 0000000..91e145c Binary files /dev/null and b/rcswitch-pi/rawsend.o differ diff --git a/rcswitch-pi/send b/rcswitch-pi/send new file mode 100755 index 0000000..f1ccb4a Binary files /dev/null and b/rcswitch-pi/send differ diff --git a/rcswitch-pi/send.cpp b/rcswitch-pi/send.cpp new file mode 100644 index 0000000..0477586 --- /dev/null +++ b/rcswitch-pi/send.cpp @@ -0,0 +1,146 @@ +/* + Usage: ./send + SystemCodeType is 1 for default and 2 for switches with 10 Bits 123456ABCD + Command is 0 for OFF and 1 for ON + */ + +#include "RCSwitch.h" +#include +#include +#include + +int main(int argc, char *argv[]) { + + /* + output PIN is hardcoded for testing purposes + see https://projects.drogon.net/raspberry-pi/wiringpi/pins/ + for pin mapping of the raspberry pi GPIO connector + */ + int PIN = 2; // GPIO-PIN 17 + int systemCodeType = atoi(argv[1]); + int systemCode = atoi(argv[2]); + int unitCode = atoi(argv[3]); + int command = atoi(argv[4]); + char pSystemCode[14]; + + if (wiringPiSetup () == -1) return 1; + printf("sending systemCodeType[%i] systemCode[%i] unitCode[%i] command[%i] ...\n", systemCodeType, systemCode, unitCode, command); + RCSwitch mySwitch = RCSwitch(); + printf("defining transmit PIN[%i] ... ",PIN); + mySwitch.enableTransmit(PIN); + printf("success\n"); + printf("computing system Code Type ...\n"); + switch(systemCodeType) + { + case 1: + { + printf("Switching \"default\" system[%i] unit[%i] ... ", systemCode, unitCode); + switch(command) + { + case 0: + { + printf("off\n"); + mySwitch.switchOff(systemCode, unitCode); + break; + } + case 1: + { + printf("on\n"); + mySwitch.switchOn(systemCode, unitCode); + break; + } + default: + { + printf("command[%i] is unsupported\n", command); + return -1; + } + } + break; + } + case 2: + { + printf("computing systemcode for Intertechno Type B house[%i] unit[%i] ... ",systemCode, unitCode); + switch(systemCode) + { + // house/family code A=1 - P=16 + case 1: { printf("1/A ... "); strcpy(pSystemCode,"0000"); break; } + case 2: { printf("2/B ... "); strcpy(pSystemCode,"F000"); break; } + case 3: { printf("3/C ... "); strcpy(pSystemCode,"0F00"); break; } + case 4: { printf("4/D ... "); strcpy(pSystemCode,"FF00"); break; } + case 5: { printf("5/E ... "); strcpy(pSystemCode,"00F0"); break; } + case 6: { printf("6/F ... "); strcpy(pSystemCode,"F0F0"); break; } + case 7: { printf("7/G ... "); strcpy(pSystemCode,"0FF0"); break; } + case 8: { printf("8/H ... "); strcpy(pSystemCode,"FFF0"); break; } + case 9: { printf("9/I ... "); strcpy(pSystemCode,"000F"); break; } + case 10: { printf("10/J ... "); strcpy(pSystemCode,"F00F"); break; } + case 11: { printf("11/K ... "); strcpy(pSystemCode,"0F0F"); break; } + case 12: { printf("12/L ... "); strcpy(pSystemCode,"FF0F"); break; } + case 13: { printf("13/M ... "); strcpy(pSystemCode,"00FF"); break; } + case 14: { printf("14/N ... "); strcpy(pSystemCode,"F0FF"); break; } + case 15: { printf("15/O ... "); strcpy(pSystemCode,"0FFF"); break; } + case 16: { printf("16/P ... "); strcpy(pSystemCode,"FFFF"); break; } + default: + { + printf("systemCode[%s] is unsupported\n", systemCode); + return -1; + } + } + printf("got systemCode\n"); + switch(unitCode) + { + // unit/group code 01-16 + case 1: { printf("1 ... "); strcat(pSystemCode,"0000"); break; } + case 2: { printf("2 ... "); strcat(pSystemCode,"F000"); break; } + case 3: { printf("3 ... "); strcat(pSystemCode,"0F00"); break; } + case 4: { printf("4 ... "); strcat(pSystemCode,"FF00"); break; } + case 5: { printf("5 ... "); strcat(pSystemCode,"00F0"); break; } + case 6: { printf("6 ... "); strcat(pSystemCode,"F0F0"); break; } + case 7: { printf("7 ... "); strcat(pSystemCode,"0FF0"); break; } + case 8: { printf("8 ... "); strcat(pSystemCode,"FFF0"); break; } + case 9: { printf("9 ... "); strcat(pSystemCode,"000F"); break; } + case 10: { printf("10 ... "); strcat(pSystemCode,"F00F"); break; } + case 11: { printf("11 ... "); strcat(pSystemCode,"0F0F"); break; } + case 12: { printf("12 ... "); strcat(pSystemCode,"FF0F"); break; } + case 13: { printf("13 ... "); strcat(pSystemCode,"00FF"); break; } + case 14: { printf("14 ... "); strcat(pSystemCode,"F0FF"); break; } + case 15: { printf("15 ... "); strcat(pSystemCode,"0FFF"); break; } + case 16: { printf("16 ... "); strcat(pSystemCode,"FFFF"); break; } + default: + { + printf("unitCode[%i] is unsupported\n", unitCode); + return -1; + } + } + strcat(pSystemCode,"0F"); // mandatory bits + switch(command) + { + case 0: + { + strcat(pSystemCode,"F0"); + mySwitch.sendTriState(pSystemCode); + printf("sent TriState signal: pSystemCode[%s]\n",pSystemCode); + break; + } + case 1: + { + strcat(pSystemCode,"FF"); + mySwitch.sendTriState(pSystemCode); + printf("sent TriState signal: pSystemCode[%s]\n",pSystemCode); + break; + } + default: + { + printf("command[%i] is unsupported\n", command); + return -1; + } + } + break; + } + default: + { + printf("command sequence unknown, aborting!\n"); + return -1; + } + } + return 0; + } diff --git a/rcswitch-pi/send.o b/rcswitch-pi/send.o new file mode 100644 index 0000000..bc0e717 Binary files /dev/null and b/rcswitch-pi/send.o differ diff --git a/scripts/lockbutton.sh.d/lights b/scripts/lockbutton.sh.d/lights index f6ba977..bff8d7d 100755 --- a/scripts/lockbutton.sh.d/lights +++ b/scripts/lockbutton.sh.d/lights @@ -11,13 +11,16 @@ then logger -t $(basename $0) "switching all lights off" for i in {1..16} do - /usr/local/bin/433send 2 1A $i 0 #off + for j in {1..16} + do + /usr/local/bin/433send 2 $j $i 0 #off + done done logger -t $(basename $0) "all lights should be off now" fi if [ "$1" = "released" ] then # switch status lights on, in any case - /usr/local/bin/433send 2 1A 2 1 #on + /usr/local/bin/433send 2 2A 1 1 #on fi if [ "$1" = "released" ] && # the door has been opened # [ "$(cat /run/spacestatus)" = "open" ] && # status is open @@ -30,7 +33,7 @@ then fi # type (2=10bit) -# | house 1-16 (always 1 in our case) +# | house 1-16 (the dial thingie) # | |group A-P (the dial thingie) # | || unit (1-16) (the button, usually 1-4) # | || | on/off diff --git a/scripts/spaceapikey.txt.sample b/scripts/spaceapikey.txt.sample new file mode 100644 index 0000000..378cd14 --- /dev/null +++ b/scripts/spaceapikey.txt.sample @@ -0,0 +1 @@ +96f7896f97asdf89u0a9s7d7fdasgsda88af diff --git a/scripts/upd_status.sh b/scripts/upd_status.sh index b6d53c8..0b508d7 100755 --- a/scripts/upd_status.sh +++ b/scripts/upd_status.sh @@ -6,10 +6,10 @@ P() { while ! mkdir "$LockDir" 2>/dev/null do LockDirStamp=$(stat -c %Y "$LockDir" 2>/dev/null) - if [ "$LockDirStamp" != "" ] && [ "$LockDirStamp" -lt $(date --date "90 seconds ago" +%s) ] + if [ "$LockDirStamp" != "" ] && [ "$LockDirStamp" -lt $(date --date "300 seconds ago" +%s) ] then rmdir "$LockDir" - logger -t $(basename $0) "deleting stale semaphore dir $LockDir" + logger -t $(basename $0) "$$ deleting stale semaphore dir $LockDir" fi sleep 1 done @@ -18,7 +18,7 @@ V() { rmdir "$LockDir" 2>/dev/null if [ $? -ne 0 ] then - logger -t $(basename $0) "semaphore dir $LockDir disappeared while running" + logger -t $(basename $0) "$$ semaphore dir $LockDir disappeared while running" fi } P @@ -26,10 +26,10 @@ if [ ! -f /run/spacestatus ] # self initilizing on new install or boot then if [ -f /root/var/spacestatus ] then # we could also get it from spaceapi, so that could should go here: - logger -t $(basename $0) "boot detected, restoring spacestatus to $(cat /root/var/spacestatus)" + logger -t $(basename $0) "$$ boot detected, restoring spacestatus to $(cat /root/var/spacestatus)" cp -p /root/var/spacestatus /run/spacestatus # restore from backup else - logger -t $(basename $0) "never run before (new install?) setting spacestatus to closed" + logger -t $(basename $0) "$$ never run before (new install?) setting spacestatus to closed" echo "closed" > /run/spacestatus fi chown www-data /run/spacestatus @@ -42,14 +42,14 @@ nai=$(stat -c "%Y" /run/spacestatus) # get mtime as status change time if [ "$status" = "open" ] then /usr/bin/curl --max-time 1 --silent --data key="$spaceapikey" --data-urlencode sensors='{"state":{"open":true,"lastchange":'"$nai"'}}' http://spaceapi.syn2cat.lu/sensor/set - #logger -t $(basename $0) "sending status $status to spacapi ret=$?" + #logger -t $(basename $0) "$$ sending status $status to spacapi ret=$?" fi for plugin in $(ls "$0".d) do if [ -x "$0".d/"$plugin" ] then "$0".d/"$plugin" "$status" "$oldstatus" - logger -t $(basename $0) "called $plugin '$status' '$oldstatus'. ret=$?" + logger -t $(basename $0) "$$ called $plugin '$status' '$oldstatus'. ret=$?" fi done @@ -60,13 +60,13 @@ then # will be the time of closing but not that of actually shutting the door # but the status will only be updated once the door is shut /usr/bin/curl --max-time 1 --silent --data key="$spaceapikey" --data-urlencode sensors='{"state":{"open":false,"lastchange":'"$nai"'}}' http://spaceapi.syn2cat.lu/sensor/set - #logger -t $(basename $0) "sending status $status to spacapi ret=$?" + #logger -t $(basename $0) "$$ sending status $status to spacapi ret=$?" fi if [ $nai -ne $(stat -c "%Y" /root/var/spacestatus) ] # backup file in case it changed then cp -p /run/spacestatus /root/var/spacestatus - logger -t $(basename $0) "spacestatus changed, saving to SD. ret=$?" + logger -t $(basename $0) "$$ spacestatus changed, saving to SD. ret=$?" fi presency=$(cat /run/presency) if [ "$status" = "closed" ] diff --git a/scripts/upd_status.sh.d/lights b/scripts/upd_status.sh.d/lights index f6ba977..bff8d7d 100755 --- a/scripts/upd_status.sh.d/lights +++ b/scripts/upd_status.sh.d/lights @@ -11,13 +11,16 @@ then logger -t $(basename $0) "switching all lights off" for i in {1..16} do - /usr/local/bin/433send 2 1A $i 0 #off + for j in {1..16} + do + /usr/local/bin/433send 2 $j $i 0 #off + done done logger -t $(basename $0) "all lights should be off now" fi if [ "$1" = "released" ] then # switch status lights on, in any case - /usr/local/bin/433send 2 1A 2 1 #on + /usr/local/bin/433send 2 2A 1 1 #on fi if [ "$1" = "released" ] && # the door has been opened # [ "$(cat /run/spacestatus)" = "open" ] && # status is open @@ -30,7 +33,7 @@ then fi # type (2=10bit) -# | house 1-16 (always 1 in our case) +# | house 1-16 (the dial thingie) # | |group A-P (the dial thingie) # | || unit (1-16) (the button, usually 1-4) # | || | on/off diff --git a/scripts/upd_status.sh.d/tweet b/scripts/upd_status.sh.d/tweet index 0ba522a..1577d1a 100755 --- a/scripts/upd_status.sh.d/tweet +++ b/scripts/upd_status.sh.d/tweet @@ -2,7 +2,7 @@ '', + 'oauth_access_token_secret' => '', + 'consumer_key' => '', + 'consumer_secret' => '' +); +?> diff --git a/systemfiles/inittab b/systemfiles/inittab index 1e41501..07985e1 100644 --- a/systemfiles/inittab +++ b/systemfiles/inittab @@ -73,4 +73,4 @@ T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100 # pidor P0:2345:respawn:/root/pidor/scripts/lockbutton.sh -#P1:2345:respawn:/root/pidor/scripts/phone_notification.sh +P1:2345:respawn:/root/pidor/scripts/beamerdetect.sh