motion-sensor/motion.c

100 lines
3.1 KiB
C

#include <unistd.h>
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
#define MOTION_PIN 0
#define SECONDS_TO_OFF 5*60
int pin_read = 0;
int state = 1;
unsigned long counter = 0;
size_t curl_callback(void *dest, size_t size, size_t nmemb, void *userp) {
//This is only to "process" the body of the HTTP Post. curl will not return else.
return 0;
}
size_t curl_output(void *buffer, size_t size, size_t nmemb, void *userp) {
//This is to hide the output.
return size * nmemb;
}
void light_control_script(int turn_on) {
CURL *curl;
CURLcode res = curl_global_init(CURL_GLOBAL_ALL);
if(res != CURLE_OK) {
printf("curl init failed\n");
return;
}
curl = curl_easy_init();
if(curl) {
if(turn_on) {
printf("Running light on script\n");
curl_easy_setopt(curl, CURLOPT_URL, "https://hass.c0ntroller.de/api/services/script/light_kitchen_on");
} else {
printf("Running light off script\n");
curl_easy_setopt(curl, CURLOPT_URL, "https://hass.c0ntroller.de/api/services/script/light_kitchen_off");
}
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, curl_callback);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_output);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 0L);
struct curl_slist *chunk = NULL;
chunk = curl_slist_append(chunk, "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiIwYzBjYzMzOWZmOGQ0NjBiYmJiYzI3NjA2M2U1MjhjNCIsImlhdCI6MTYwMzcxMDAzMywiZXhwIjoxOTE5MDcwMDMzfQ.HSnBiBNG6x6b1AAgh6AEAUALj4uSWfv-y-YS7QrNve0");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1L);
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
curl_slist_free_all(chunk);
}
curl_global_cleanup();
}
int main(){
wiringPiSetup();
pinMode(MOTION_PIN, INPUT);
while(1){
pin_read = digitalRead(MOTION_PIN);
while(state && !pin_read){
counter += 1;
if(counter >= SECONDS_TO_OFF*2){
printf("Turning off\n");
//system("tvservice -o");
system("vcgencmd display_power 0");
light_control_script(0);
state = 0;
}
usleep(500*1000);
pin_read = digitalRead(MOTION_PIN);
}
if(!state && pin_read){
printf("Turning on\n");
light_control_script(1);
system("vcgencmd display_power 1");
//system("tvservice -p");
//system("fbset -depth 8");
//usleep(50*1000);
//system("fbset -depth 16");
//usleep(50*1000);
//system("fbset -depth 24");
//usleep(50*1000);
//system("fbset -depth 32");
state = 1;
}
counter = 0;
usleep(500*1000);
}
}