Bộ hẹn giờ đáng tin cậy cho đèn luôn bật / tắt / tắt


7

Tôi có một bóng đèn ZWave và một công tắc tường 4 nút ZWave, cả hai đều được kết nối với Domoticz được cài đặt trên Raspberry Pi.

Tôi muốn các tình huống sau:

  • Nút 1: bật đèn trong 30 phút
  • Nút 2: tắt đèn
  • Nút 3: đèn luôn sáng
  • Nút 4: triệu tập Cthulhu

Mỗi nút ghi đè hành động trước đó (Nút 3 -> Nút 1 = bật trong 30 phút)

Đấu dây và lập trình các nút rất dễ, nhưng bây giờ, làm thế nào về bộ đếm thời gian? Tôi muốn tránh tạo ra một dịch vụ tự chế vì tôi sợ làm phiền init.d.

Tôi có 3 khả năng:


Công tắc giả

Domoticz cho phép tạo ra một công tắc giả có thể thay đổi trạng thái sau một thời gian được đưa ra trong một giao diện:

công tắc giả domoticz

Ưu

  • hẹn giờ ra khỏi kệ!
  • Tôi có thể tương tác khá nhanh giữa công tắc trên tường và đèn

Nhược điểm

  • Mặc dù Domoticz xử lý MQTT, nhưng sẽ có rất nhiều tập lệnh LUA và "chặn" để kết nối các thiết bị
  • thời gian có thể không dễ dàng cấu hình ...

atatq

at là một lệnh linux để lập kế hoạch hành động kịp thời, đơn giản như

at [when] < [what]

Ưu

  • dịch vụ đa giờ
  • dễ sử dụng và gọi

Nhược điểm

  • tại chỉ cung cấp một ID duy nhất, trừ khi phân tích cú pháp lệnh theo kế hoạch, tôi không thể đặt tên cho công việc (trừ khi có lệnh linux ma thuật ...)
  • do đó tôi cần mã hóa / triển khai công cụ đối sánh công việc bằng cơ sở dữ liệu

Crontab

Crontab là một dịch vụ linux để lên kế hoạch cho các nhiệm vụ lặp đi lặp lại. Trong trường hợp của tôi, nó sẽ là một đơn giản

# check every minute
* * * * * /path/checktimer.sh

Ưu

  • Kích hoạt thời gian đáng tin cậy

Nhược điểm

  • Không thể quản lý giây ...
  • Vẫn bị buộc phải duy trì ở đâu đó một công việc phù hợp

Với câu hỏi của tôi:

  • Bạn có phải quản lý bộ hẹn giờ như thế này không?
  • Tôi đã bỏ lỡ các giải pháp đáng tin cậy / cấu hình khác?
  • Bạn có một ưu tiên với các giải pháp trên?

1
Chỉ cần sử dụng sleephoặc usleepđể kích hoạt tắt? Đây là chức năng cơ bản bên dưới, và bạn có thể sử dụng jobsđể xử lý các công việc nền (chủ yếu là hủy bỏ kế hoạch tắt nếu tôi hiểu đúng)
Tensibai

sleepcó vẻ tệ hơn: bạn chỉ vượt qua một thời gian và nó không trả lại gì cả. Bạn có thể trả lời và đưa ra một ví dụ bằng cách sử dụng jobs?
Goufalite

Câu trả lời:


5

Mỗi yêu cầu tôi sẽ cố gắng đưa ra một ví dụ về cách tôi sẽ giải quyết nó (với việc jobsxử lý bash shell ):

Nút 1:
Khi bật đèn X trong 30 giây và đèn Y trong 5 phút:

echo "Switch on lamp_x" && sleep 30s && echo "Switch off lamp_x" &
echo "Switch on lamp_y" && sleep 5m && echo "Switch off lamp_y" &

Do hạn chế của quy trình, điều này phải nằm trên hai dòng riêng biệt, tiếng vang ở trên nên được thay thế bằng các lệnh thực tế rõ ràng.

nút 3:
Sau đó, bạn có thể killngủ để ngăn chặn nó và giữ cho đèn sáng bằng cách lấy một công việc và giết nó:

kill $(jobs -p %?lamp_y)
echo "Switch on lamp_y"

Thực tế là các lệnh bị xiềng xích &&sẽ ngăn lệnh sau khi sleepchạy vì giấc ngủ không thoát ra đúng cách.
Điều này không xử lý công việc không tồn tại, có thể khiến kill bị trả về lỗi, không có gì xấu xảy ra ở đây.

Nút 2: Sử dụng phương pháp tương tự như nút 3, nhưng sử dụng lệnh dừng và giết các công việc nếu có.

Nút 4:

echo "Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn"

(xin lỗi tôi không biết bạn muốn gì ở đây, thiết lập cho đầy đủ)


Chi tiết về việc triển khai về jobs:

jobs -p %?lamp_ytrả về giá trị hiện tại -pcủa một công việc khớp với jobspec %?lamp_ycó nghĩa là lamp_ycó thể xuất hiện ở bất cứ đâu trong dòng lệnh, chọn cẩn thận những gì sẽ sử dụng ở đây (nhưng tôi cá là bạn có một định danh duy nhất cho những thứ hoặc nhóm những thứ bạn muốn kiểm soát).


3
Tôi không tình nguyện kiểm tra việc bạn thực hiện nút 4.
Sean Houlihane

2
Một công việc giết chết lót là hoàn hảo! Cảm ơn bạn! Tôi BTW Tôi đã thử thực hiện nút 4 của bạn và bây giờ tất cả đèn của tôi đều nhấp nháy và có âm thanh rùng rợn ở khắp mọi nơi, tuyệt vời cho một bữa tiệc Halloween!
Goufalite

@Goufalite rất vui vì nó đã giúp đỡ
Tensibai

Protip: bắt đầu lệnh với true taskid &&để bạn có thể dễ dàng theo dõi công việc của mình! Thật không may, điều này không hoạt động nếu PHP hoặc chương trình khác gọi lệnh bởi vì nó sẽ được khởi chạy dưới dạng một
nhánh con

3

Nếu bạn muốn sử dụng một dịch vụ trực tuyến cho việc này, bạn sẽ có thể sử dụng https://www.opesify.com Họ hỗ trợ các chuỗi và biến (và bộ hẹn giờ). Tôi đã không sử dụng dịch vụ của họ trong sự tức giận, nhưng có vẻ như bạn sẽ có thể sử dụng bộ đếm thời gian để giảm một biến số (xác định thời gian còn lại đúng giờ) và các sự kiện kích hoạt khác nhau có thể buộc biến đó thành một giá trị mới.

Chúng hỗ trợ tích hợp IFTTT, do đó, hầu như mọi điểm cuối đều có thể được liên kết theo một cách nào đó.


3

Tôi đã tìm thấy một cách khác khá tốn kém nhưng vẫn hoạt động với quy trình bên ngoài, chẳng hạn như PHP system: screen

Đầu tiên, cài đặt nó:

sudo apt-get install screen

Sau đó gọi chức năng của bạn

screen -dm -S taskid bash -c 'sleep 20 && command'
    -dm : detach process
    -S  : identify screen by name

Để liệt kê các nhiệm vụ của bạn

ls /var/run/screen/S-www-data (or S-anotheruser, warning it is user bound, or sudo it)

Giết nó

screen -S taskid -X kill
    -S : identify screen by name
    -X : access the screen and perform this command
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.